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

126

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

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

Но я не понимаю, где это делать. Я имею в виду, должно ли это идти в объявлении модуля приложения? то есть:

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

Но где тогда мне загрузить библиотеку подчеркивания? У меня просто есть на моей индексной странице директива ng-app и ссылка на скрипт как для angular-js, так и для библиотек подчеркивания?

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>
...  

Как мне этого добиться?

Pablo
источник
ну что ты пробовал и не получилось?
mpm
Ну, я не знаю, с чего начать. Как связать любой король файлов <script> с частью angularjs? (контроллеры, службы, директивы ... и т. д.). Есть ли выражение типа require ('...')?
Пабло
просто объявите правильный тег скрипта с подчеркиванием в своем html-файле, как вы это сделали с angular или jquery.
mpm
Будет ли он доступен автоматически под знаком _ ?? Как??
Пабло

Ответы:

231

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

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

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

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
});
satchmorun
источник
27
Я не понимаю, зачем вы вводите его, когда он уже находится в области глобального окна.
Вальтер Стабош
36
Вероятно, по тем же причинам вы что-нибудь вводите вместо того, чтобы помещать все в глобальную область видимости. Однако, поскольку у вас гораздо меньше шансов заменить свою библиотеку подчеркивания во время тестирования, чем какую-либо другую более конкретную зависимость, понятно, что это не кажется необходимым.
признаться.
50
это необходимо, когда вы добавляете в файл «use strict». Поскольку подчеркивание / lodash не определено, оно выдаст ReferenceError: _ is not defined ... вы должны ввести его или использовать window._
Shanimal 06
23
Ха! Я хотел сделать инъекцию, потому что это круто, спасибо, что объяснили причину, @Shanimal.
Aditya MP
10
вы также можете ввести _ для тестирования. Как бы вы
применили
32

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

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

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

    <script src="bower_components/underscore/underscore.js">
  2. Возьми:

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

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

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

    angular.module('MyApp').controller('MyCtrl', function ($scope, _) {
    ...
    //Use underscore
    _.each(...);
    ...
унифицировать
источник
Не работает. Я получаю неопределенную ошибку:Uncaught ReferenceError: _ is not defined
chovy 05
Я добавил пояснение: нужно включить underscore.js. Этот коннектор только помогает вам использовать его в сервисе. См @ ответ satchmorun в
унифицированном
31

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

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.

провода
источник
это выглядит хорошо, но у вас есть пример? Мне нужно изменить весь верхний регистр на верхний для первого символа только с помощью _.capitalize ()
Нейт
2
Я думаю, это должно сработать <p>{{ _.capitalize('lalala') }}</p>?
провода
1
@LVarayut Я не знаю, почему бы не попробовать? (С тех пор я перешел на ReactJS)
провода
Пожалуйста, используйте вместо этого сервис. Избегайте добавления чего-либо в ваш $ rootScope, это поможет вам повысить производительность.
Тим Хонг,
Не уверен, что я сделал не так, но мне не удалось заставить работать часть «использование в представлениях». Но передача службы контроллеру, а затем tpl через $ ctrl работает.
Olivvv
3

Вы также можете взглянуть на этот модуль для angular

https://github.com/floydsoft/angular-underscore

Пол Шелдрейк
источник
как загрузить эту штуку в контроллер?
chovy 05
3
Я всегда беспокоюсь о модулях, которые не обновлялись годами,
Тахир Халид
1

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

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

Ник Уайт
источник
-2

вы можете использовать этот модуль -> https://github.com/jiahut/ng.lodash

это lodashтакunderscore

jiahut
источник
1
не могли бы вы предоставить инструкции по использованию
Пол Прейбиш