Użyj podkreślenia w kontrolerach Angular


126

Jak używać biblioteki podkreślenia w kontrolerach angularjs?

W tym poście: AngularJS limitTo przez ostatnie 2 rekordy ktoś zasugerował przypisanie zmiennej _ do rootScope, aby biblioteka była dostępna dla wszystkich zakresów w aplikacji.

Ale nie wiem, gdzie to zrobić. Chodzi mi o to, czy powinno to iść na deklarację modułu aplikacji? to znaczy:

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

Ale gdzie w takim razie załadować underscore lib? Po prostu mam na mojej stronie indeksu dyrektywę ng-app i odwołanie do skryptu do bibliotek angular-js i underscore?

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

Jak to osiągnąć?


dobrze, co próbowałeś i nie zadziałało?
mpm

Cóż, nie wiem, od czego zacząć. Jak powiązać dowolny typ plików <script> z częścią angularjs? (administratorzy, usługi, dyrektywy ... itd.). Czy jest jakieś wyrażenie typu require ('...')?
Pablo

po prostu zadeklaruj odpowiedni znacznik skryptu z podkreśleniem w pliku html, tak jak w przypadku angular lub jquery.
mpm

Czy będzie dostępny automatycznie pod znakiem _ ?? W jaki sposób??
Pablo,

Odpowiedzi:


231

Kiedy włączysz podkreślenie, przyczepia się do windowobiektu, więc jest dostępna globalnie.

Możesz więc używać go z kodu Angular w takiej postaci, w jakiej jest.

Możesz również zapakować go w usługę lub fabrykę, jeśli chcesz, aby został wstrzyknięty:

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

Następnie możesz poprosić o _moduł w swojej aplikacji:

// 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
Nie rozumiem, dlaczego miałbyś go wstrzyknąć, skoro jest już w globalnym zakresie okna.
Walter Stabosz,

36
Prawdopodobnie z tych samych powodów, dla których wprowadzasz cokolwiek, zamiast umieszczać wszystko w zasięgu globalnym. Jednakże, ponieważ jest dużo mniej prawdopodobne, że będziesz chciał zastąpić swoją bibliotekę podkreśleń podczas testowania niż inne, bardziej szczegółowe zależności, zrozumiałe jest, że nie wydaje się to konieczne.
fess.

50
jest to konieczne, gdy dodasz do pliku słowo „użyj ścisłego”. Ponieważ podkreślenie / lodash nie jest zdefiniowane, spowoduje to zgłoszenie błędu ReferenceError: _ nie jest zdefiniowane ... musisz go wstrzyknąć lub użyć okna._
Shanimal

23
Ha! Chciałem zrobić zastrzyk, ponieważ jest fajny, dzięki za podanie mi prawdziwego powodu, @Shanimal.
Aditya MP

10
możesz także chcieć wstrzyknąć _ w celu przetestowania. Jak
zabrałbyś

32

Wdrożyłem sugestię @ satchmorun tutaj: https://github.com/andresesfm/angular-underscore-module

Aby z niego skorzystać:

  1. Upewnij się, że w swoim projekcie umieściłeś podkreślenie.js

    <script src="bower_components/underscore/underscore.js">
  2. Zdobyć:

    bower install angular-underscore-module
  3. Dodaj angular-underscore-module.js do swojego głównego pliku (index.html)

    <script src="bower_components/angular-underscore-module/angular-underscore-module.js"></script>
  4. Dodaj moduł jako zależność w definicji aplikacji

    var myapp = angular.module('MyApp', ['underscore'])
  5. Aby użyć, dodaj jako wstrzykniętą zależność do kontrolera / usługi i jest gotowa do użycia

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

Wydaje się, że nie działa. Otrzymuję nieokreślony błąd:Uncaught ReferenceError: _ is not defined
chovy

Dodałem wyjaśnienie: musisz dołączyć podkreślenie.js. To złącze pomaga tylko w używaniu go w usłudze. Zobacz odpowiedź @ satchmorun
ujednolicić

31

Używam tego:

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

Więcej informacji na ten temat można znaleźć na https://github.com/angular/angular.js/wiki/Understanding-Dependency-Injectionrun .


to wygląda dobrze, ale czy masz przykład? Muszę zmienić wszystkie wielkie litery na wielkie na pierwszym znaku tylko za pomocą _.capitalize ()
Nate

2
Myślę, że to powinno działać <p>{{ _.capitalize('lalala') }}</p>?
przewody

1
@LVarayut Nie wiem, dlaczego nie spróbować? (Mam od przeniósł się do ReactJS)
przewody

Zamiast tego skorzystaj z usługi. Unikaj dodawania rzeczy do $ rootScope pomoże ci uzyskać lepszą wydajność.
Tim Hong

Nie jestem pewien, co zrobiłem źle, ale nie udało mi się uruchomić części dotyczącej używania w widokach. Ale przekazanie usługi do kontrolera, a następnie do tpl przez $ ctrl działa.
Olivvv


1

Jeśli nie masz nic przeciwko używaniu lodash, wypróbuj https://github.com/rockabox/ng-lodash , całkowicie otacza lodash, więc jest to jedyna zależność i nie musisz ładować żadnych innych plików skryptów, takich jak lodash.

Lodash jest całkowicie poza zasięgiem okna i nie ma nadziei, że został załadowany przed Twoim modułem.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.