Utilizzare il trattino basso all'interno dei controller angolari


126

Come si usa la libreria di sottolineatura all'interno dei controller angularjs?

In questo post: AngularJS limitTo negli ultimi 2 record qualcuno ha suggerito di assegnare una _ variabile a rootScope in modo che la libreria sia disponibile per tutti gli ambiti all'interno dell'app.

Ma non sono chiaro dove farlo. Voglio dire, dovrebbe andare sulla dichiarazione del modulo app? vale a dire:

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

Ma allora dove carico la sottolineatura lib? Ho solo sulla mia pagina indice la direttiva ng-app e il riferimento allo script sia per le librerie angular-js che per quelle 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>
...  

Come posso raggiungere questo obiettivo?


bene cosa hai provato e non ha funzionato?
mpm,

Beh, non so da dove cominciare. Come posso collegare qualsiasi re dei file <script> con la parte angularjs? (controllori, servizi, direttive ... ecc.). C'è qualche richiesta ('...') come espressione?
Pablo,

dichiara semplicemente il tag di script corretto con trattino basso nel tuo file html, come hai fatto con angular o jquery.
mpm,

Sarà disponibile automaticamente sotto il carattere _ ?? Come??
Pablo,

Risposte:


231

Quando includi Underscore, si attacca windowall'oggetto e quindi è disponibile a livello globale.

Quindi puoi usarlo dal codice angolare così com'è.

Puoi anche avvolgerlo in un servizio o in una fabbrica, se desideri che venga iniettato:

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

E poi puoi chiedere _nel modulo della tua app:

// 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
Non capisco perché lo si inietti quando è già nell'ambito della finestra globale.
Walter Stabosz,

36
Probabilmente per le stesse ragioni per cui si inietta qualcosa, invece di mettere tutto nell'ambito globale. Tuttavia, poiché è molto meno probabile che si desideri sostituire la libreria di sottolineatura durante il test rispetto ad altre dipendenze più specifiche, è comprensibile che non sembri necessario.
Fess.

50
è necessario quando aggiungi "usa rigoroso" al tuo file. Poiché il carattere di sottolineatura / lodash non è definito, verrà generato ReferenceError: _ non è definito ... è necessario iniettarlo o utilizzare window._
Shanimal

23
Ha! Volevo fare l'iniezione perché è bello, grazie per avermi dato un vero motivo, @Shanimal.
MP Aditya,

10
potresti anche voler iniettare _ per motivi di test. Come faresti a portare la dipendenza del trattino basso in un ambiente di test suite
sunwukung,

32

Ho implementato il suggerimento di @ satchmorun qui: https://github.com/andresesfm/angular-underscore-module

Per usarlo:

  1. Assicurati di aver incluso underscore.js nel tuo progetto

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

    bower install angular-underscore-module
  3. Aggiungi angular-underscore-module.js al tuo file principale (index.html)

    <script src="bower_components/angular-underscore-module/angular-underscore-module.js"></script>
  4. Aggiungi il modulo come dipendenza nella definizione della tua app

    var myapp = angular.module('MyApp', ['underscore'])
  5. Per usare, aggiungi come dipendenza iniettata al tuo Controller / Servizio ed è pronto per l'uso

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

Non sembra funzionare. Ottengo un errore indefinito:Uncaught ReferenceError: _ is not defined
chovy

Ho aggiunto il chiarimento: è necessario includere underscore.js. Questo connettore consente solo di utilizzarlo in un servizio. Vedere @ risposta di satchmorun
Unificare

31

Io lo uso questo:

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

Vedi https://github.com/angular/angular.js/wiki/Understanding-Dependency-Injection circa a metà strada per ulteriori informazioni su run.


sembra buono ma hai un esempio? Devo cambiare tutto maiuscolo in maiuscolo sul primo carattere solo usando _.capitalize ()
Nate

2
Penso che dovrebbe funzionare <p>{{ _.capitalize('lalala') }}</p>?
fili

1
@Larayut Non lo so, perché non provarlo? (Da allora ho trasferito a ReactJS)
fili

Si prega di utilizzare il servizio invece. Evitare di aggiungere elementi a $ rootScope ti aiuterà ad avere prestazioni migliori.
Tim Hong

Non sono sicuro di cosa ho fatto di sbagliato, ma non sono riuscito a far funzionare la parte "uso nelle viste". Ma passare il servizio al controller e quindi al tpl tramite $ ctrl funziona.
Olivvv,


1

Se non ti dispiace usare lodash, prova https://github.com/rockabox/ng-lodash che avvolge completamente lodash, quindi è l'unica dipendenza e non è necessario caricare altri file di script come lodash.

Lodash è completamente fuori dall'ambito della finestra e non "spera" che sia stato caricato prima del modulo.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.