2013-06-28 15 views
6

Ho un problema strano con il non poter utilizzare le funzioni di sottolineatura all'interno del {{}} o all'interno della ripetizione ng e di altre espressioni. La mia funzione di test esatta era

{{_.last([1,2,3,4])}} 

... nel codice HTML della pagina.

sono in grado di vedere la risposta corretta (4) solo se faccio questo nel mio controller:

$scope._ = _; 

ho cercato di iniettare _ come una fabbrica nel mio modulo principale dell'applicazione e poi iniettare che nel mio controller, ma non sembra iniettarlo in $ scope.

Qualcuno può vedere l'errore che sto facendo? O c'è un meccanismo che impedirebbe alla libreria di underscore di entrare in $ scope? Sto usando angular v.1.0.7 e una versione recente di underscore (non sono sicuro del numero esatto della versione, ma è nelle ultime 3 settimane).

+0

Per chiarire, posso usare il carattere di sottolineatura all'interno del controller stesso. Non è solo "visibile" nella vista (all'interno del markup HTML). – electrichead

+0

Per chi legge questo nel 2015: per favore non farlo! Scrivi una funzione nel tuo controller e usa invece il trattino basso/Ramda/lodash ecc. Iniettare queste librerie nella tua vista aggira le protezioni nelle espressioni ed è generalmente una cattiva idea! – electrichead

risposta

5

Le espressioni angolari ({{expression}}) sono valutate rispetto all'ambito $ locale, che, nel caso in cui sia stato definito un controller, è un oggetto $ scope come nella funzione MyCtrl($scope){}.

Quindi, quando si utilizza _ nelle espressioni, lo _ viene valutato rispetto all'ambito $ e poiché $ scope.does non ha un membro _, l'espressione non riesce.

Quindi, l'unico da utilizzare _ nelle visualizzazioni è renderlo disponibile sull'oggetto $ scope con: $scope._ = _;.


Btw, se usato in un contesto del browser, di sottolineatura aggiunge _ come oggetto globale, quindi è disponibile per tutta la JS. Ciò significa che non è necessario "iniettare _ come fabbrica".

+0

Stavo provando l'iniezione a causa di questo thread (http://stackoverflow.com/questions/14968297/use-underscore-inside-controllers), ma risulta che era quello di renderlo disponibile nel controller. Ironia della sorte, la risposta alla mia domanda era nella domanda dell'OP, non nella risposta che ho trovato attraverso la ricerca su google. Ora sto inserendo il segno di sottolineatura in $ rootScope all'avvio dell'applicazione. Grazie per il chiarimento! – electrichead

Problemi correlati