Как сделать работу lodash с помощью Angular JS?

Я пытаюсь использовать lodash, используя его в директивах ng-repeat, следующим образом:

<div ng-controller="GridController" ng-repeat="n in _.range(5)">
    <div>Hello {{n}}</div>
</div>

Быть GridController:

IndexModule.controller('GridController', function () {

this._ = _

})

Однако не работает, и поэтому ничего не повторяется. Если я изменю директиву на ng-repeat="i in [1,2,3,4,5]", это сработает.

lodash уже включен через <script> в <header> до angular. Как я могу заставить его работать?

Ответ 1

Я предпочитаю вводить '_' глобально и инъективно для тестов, см. мой ответ на этот вопрос Использовать подчеркивание внутри контроллеров

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._;
  });

Ответ 2

Я просто хотел добавить некоторые пояснения к ответам @beret и @wires. Они определенно помогли и получили от этого сумасшествие, но приведение всего процесса в порядок могло кому-то подойти. Вот как я настроил среду angular с помощью lodash и получил ее работу с yoman gulp - angular для правильной работы

  • bower install lodash --save (Это добавляет к беседке и сохраняет значение bower json)

  • изменить bower json для загрузки lodash до angular. (Это помогает, если вы используете gulp и не хотите вручную помещать его в index.html, иначе поместите его в index.html перед ссылкой angular)

  • Сделайте новую константу в направлении @wires.

'use strict';

angular.module('stackSample')
  // lodash support
  .constant('_', window._);
  • Внедрение в любой сервис angular, фильтр или контроллер, как и вы:
.filter('coffeeFilter', ['_', function(_) {...}]);
  • Чтобы передать его в некоторый вид angular html, просто вставьте его в контроллер и назначьте ему переменную области видимости:
.controller('SnesController', function ($scope, _) {
  $scope._ = _;
})

Надеюсь, это поможет кому-то создать свой сайт.:)

Ответ 3

ng-repeat требуется выражение Angular, которое имеет доступ к переменным области видимости Angular. Поэтому вместо назначения _ в this назначьте его объекту $scope, который вы вводите в контроллер:

IndexModule.controller('GridController', function ($scope) {
  $scope._ = _;
})

Демо

Ответ 4

Я не уверен, какую версию Angular вы используете. Похоже, вы должны были использовать синтаксис "Контроллер как", когда вы используете 'this' для доступа к переменным в dom.

Вот решение с этим и без использования области. http://plnkr.co/edit/9IybWRrBhlgQAOdAc6fs?p=info

 <body ng-app="myApp" ng-controller="GridController as grid">
      <div ng-repeat="n in grid._.range(5)">
      <div>Hello {{n}}</div>
    </div>
  </body>