Використовуйте підкреслення всередині кутових контролерів


126

Як використовувати бібліотеку підкреслення всередині контролерів angularjs?

У цьому дописі: AngularJS limitЗа останніми двома записами хтось запропонував призначити змінну _ _ rootScope, щоб бібліотека була доступною для всіх областей програми.

Але мені не ясно, де це робити. Я маю на увазі, чи слід це надсилати на декларацію модуля додатка? тобто:

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

Але тоді де я завантажую підкреслювальну лібу? Я просто маю на своїй сторінці покажчиків директиву ng-програми та посилання на скрипт як на кутові 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>
...  

Як я цього досягти?


ну що ви спробували, а не вийшло?
mpm

Ну, я не знаю, з чого почати. Як я пов’язую будь-які файли <script> з частиною angularjs? (контролери, служби, директиви ... тощо). Чи потрібні такі вирази ('...'), як вираз?
Пабло

просто оголосіть належний тег сценарію з підкресленням у вашому HTML-файлі, як це було зроблено з angular або jquery.
м.

Чи буде доступний автоматично під символом _ Як ??
Пабло

Відповіді:


231

Якщо ви включите підкреслення, він приєднується до windowоб'єкта, і тому він доступний у всьому світі.

Таким чином, ви можете використовувати його з кутового коду як є.

Ви також можете загорнути його в службу чи на заводі, якщо ви хочете, щоб його вводили:

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

27
Я не розумію, чому ви б ввели його, коли він уже знаходиться в глобальній області вікон.
Вальтер Стабош

36
Можливо, з тих самих причин ви все-таки вводите щось замість того, щоб ставити все в глобальному масштабі. Однак, оскільки ви набагато рідше хочете замінити свою бібліотеку підкреслення під час тестування, ніж якусь іншу більш конкретну залежність, зрозуміло, що це не здається необхідним.
фіс.

50
це необхідно, коли ви додаєте до файлу "використовувати строгий". Оскільки підкреслення / lodash не визначено, він буде кидати ReferenceError: _ не визначено ... ви повинні ввести його або скористатися window._
Shanimal

23
Га! Я хотів зробити ін’єкцію, тому що це круто, дякую, що ви дали мені справжню причину, @Shanimal.
Депутат Адітія

10
ви також можете ввести _ для тестування. Як би ви пішли про те, щоб підкреслити залежність підкреслення в середовищі тестового набору
sunwukung

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

Я додав уточнення: вам потрібно включити 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 працює.
Оліввв


1

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

Лодаш повністю виходить за межі вікна і не вимагає "сподівання", що він завантажений до вашого модуля.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.