2013-06-28 17 views
6

Ich habe ein seltsames Problem mit Unterstreichungsfunktionen innerhalb der {{}} oder innerhalb der ng-Wiederholung und andere Ausdrücke zu verwenden. Meine genaue Testfunktion war

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

... direkt im HTML der Seite.

Ich bin in der Lage, die richtige Antwort (4), um zu sehen, nur wenn ich dies tue in meinem Controller:

$scope._ = _; 

Ich versuchte _ als Fabrik in meinen Haupt-Anwendungsmodul zu injizieren und dann das spritzt in meine Controller, aber es scheint nicht in den $ Bereich zu injizieren.

Kann jemand den Fehler sehen, den ich mache? Oder gibt es dort einen Mechanismus, der verhindern würde, dass die Unterstrich-Bibliothek in den $ -Scope gelangt? Ich benutze eckige v.1.0.7 und eine neuere Version von Unterstrich (nicht sicher von der genauen Versionsnummer, aber es ist innerhalb der letzten 3 Wochen).

+0

Um zu verdeutlichen, kann ich die Unterstreichung innerhalb der Controller selbst verwenden. Es ist nur nicht "sichtbar" in der Ansicht (innerhalb des HTML Markups). – electrichead

+0

An alle, die das 2015 lesen: Bitte tu das nicht! Schreiben Sie eine Funktion in Ihren Controller und verwenden Sie dort stattdessen Unterstrich/Ramda/lodash. Wenn Sie diese Bibliotheken in Ihre Ansicht einfügen, umgehen Sie die Sicherheitsvorkehrungen in Ausdrücken und sind im Allgemeinen eine schlechte Idee! – electrichead

Antwort

5

Winkelausdrücke ({{expression}}) werden gegen den lokalen $ scope ausgewertet, der, falls Sie einen Controller definiert haben, ein $ scope-Objekt ist, wie in der Funktion MyCtrl($scope){}.

Also, wenn Sie _ in Ihren Ausdrücken verwenden, wird die _ gegen den $ Scope ausgewertet, und da $ scope.does kein _ Member hat, schlägt Ausdruck fehl.

Also, die einzige _ in Ihren Ansichten zu verwenden, ist es auf $ Scope-Objekt mit: $scope._ = _;.


Btw, wenn im Browser Zusammenhang verwendet wird, unterstreichen fügt _ als globales Objekt, so ist es in Ihrem JS verfügbar. Dies bedeutet, dass "_ als Fabrik nicht injiziert" werden muss.

+0

Ich versuchte die Injektion wegen dieses Threads (http://stackoverflow.com/questions/14968297/use-underscore-inside-controllers), aber es stellt sich heraus, dass es in der Steuerung verfügbar war. Ironischerweise war die Antwort auf meine Frage in der Frage des OP, nicht in der Antwort, die ich durch die Google-Suche fand. Ich injiziere jetzt Unterstrich in das $ rootScope, wenn die Anwendung geladen wird. Danke fürs klarstellen! – electrichead

Verwandte Themen