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


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.