Использовать подчеркивание внутри контроллеров Angular

Как использовать библиотеку подчеркивания внутри контроллеров angularjs?

В этом сообщении: Ограничение по AngularJSДобавить последние 2 записи  кто-то предложил назначить переменную _ для rootScope, чтобы библиотека была доступна для всех областей приложения.

Но я не знаю, где это сделать. Я имею в виду, должен ли он следовать декларации модуля приложения? i.e:

var myapp = angular.module('offersApp', [])
            .config(['$rootScope', function($rootScope) { }

Но тогда, где я загружаю underscore lib? У меня на моей индексной странице директива ng-app и script ссылка на angular -js и underscore libs?

index.html:

<head>
</head>
<body ng-app="offersApp">
...
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="scripts/vendor/angular.js"></script>
<script src="scripts/vendor/underscore.js"></script>
...  

Как мне это достичь?

Ответ 1

Когда вы включаете Underscore, он присоединяется к объекту window и поэтому доступен по всему миру.

Таким образом, вы можете использовать его из Angular кода как есть.

Вы можете также обернуть его в службу или factory, если хотите, чтобы она была введена:

var underscore = angular.module('underscore', []);
underscore.factory('_', ['$window', function($window) {
  return $window._; // assumes underscore has already been loaded on the page
}]);

И затем вы можете запросить _ в вашем модуле приложения:

// Declare it as a dependency of your module
var app = angular.module('app', ['underscore']);

// And then inject it where you need it
app.controller('Ctrl', function($scope, _) {
  // do stuff
});

Ответ 2

Я внедрил предложение @satchmorun здесь: https://github.com/andresesfm/angular-underscore-module

Чтобы использовать его:

  • Убедитесь, что вы включили в проект проект underscore.js

    <script src="bower_components/underscore/underscore.js">
    
  • Получите его:

    bower install angular-underscore-module
    
  • Добавить angular -underscore-module.js в ваш основной файл (index.html)

    <script src="bower_components/angular-underscore-module/angular-underscore-module.js"></script>
    
  • Добавить модуль как зависимость в определении приложения

    var myapp = angular.module('MyApp', ['underscore'])
    
  • Чтобы использовать, добавьте в качестве вложенной зависимости к своему контроллеру/службе и он будет готов использовать

    angular.module('MyApp').controller('MyCtrl', function ($scope, _) {
    ...
    //Use underscore
    _.each(...);
    ...
    

Ответ 3

Я использую это:

var myapp = angular.module('myApp', [])
  // allow DI for use in controllers, unit tests
  .constant('_', window._)
  // use in views, ng-repeat="x in _.range(3)"
  .run(function ($rootScope) {
     $rootScope._ = window._;
  });

Смотрите https://github.com/angular/angular.js/wiki/Understanding-Dependency-Injection примерно наполовину для получения дополнительной информации о run.

Ответ 5

Если вы не против использования lodash, попробуйте https://github.com/rockabox/ng-lodash, он полностью завершает lodash, так что это единственная зависимость, и вы не необходимо загрузить любые другие script файлы, такие как lodash.

Lodash полностью отключен от области видимости окна и не "надеется", что он был загружен до вашего модуля.