2013-08-28 9 views
9

Wenn ich einen isolierten Bereich verwende, kann ich eine Variable über ein Attribut übergeben.Angularjs übergibt Variablen an eine Direktive mit einem geerbten (nicht isolierten) Gültigkeitsbereich

dh

<my-directive baz='foo.bar'> 

Dann auf der Richtlinie der Javascript

.directive('myDirective', function() { 
    return { 
    scope: { 
     'baz': '=' 
    } 
    } 
}); 

Gibt es eine Möglichkeit etwas ähnliches mit einem vererbten Umfang zu tun? Die Link-Funktion übergibt nur Zeichenfolgen.

Momentan parsen wir die Variable selbst und passen sie an den Bereich an. $ Parent. Es scheint, als ob es eine Hilfsfunktion oder einen einfacheren Weg geben sollte.

+0

Meinst du den Zugriff auf den übergeordneten Bereich innerhalb des Anweisungscodes? –

Antwort

14

Verwenden $eval oder $parse:

<my-directive baz='foo.bar'> 

.directive('myDirective', function($parse) { 
    return { 
    scope: true, 
    link: function(scope, element, attrs) { 
     console.log(scope.$eval(attrs.baz)); 
     var model = $parse(attrs.baz); 
     console.log(model(scope)); 
     // if you want to modify the value, use the model, not $eval: 
     model.assign(scope, "new value"); 
    } 
    } 
}); 
+0

Ich wusste nicht über $ parse. Das ist ein guter Weg, dies zu tun. – BoxerBucks

0

Wenn Sie den Bereich Objekt in der Richtlinie nicht erklären, wird es keine isolierte Rahmen eingerichtet werden, und Sie erhalten Zugang zu den bekommen Gültigkeitsbereich, der von wo das Div in dem DOM deklariert wird, übergeben wird.

Etwas wie folgt aus:

.directive('myDirective', function() { 
    return { 
    function(scope, element, attrs){ 
     //scope here = the inherited scope from the DOM 
    } 
} 

Also, wenn Sie Ihre Direktive in der DIV-Tag deklariert haben, brauchen Sie nicht wirklich als ein Attribut in dem Wert senden - Sie können es nur ziehen kann aus der Umfang.

3

mit diesem Code:

link: function(scope, elem, attrs) {} 

können Sie

attrs 

Element verwenden alle atributes dieser Richtlinie zuweisen zu erhalten.

dann können Sie einfach attrs zu jedem Umfang zuweisen und es in Ihrem e.x templae verwenden.

scope.someValue = attrs.attrName; 

Fazit:

Richtlinie:

link: function(scope, elem, attrs) { 
     scope.someValue = attrs.attrName; 
    } 

Richtlinie Vorlage:

<div> {{someValue}} <div> 

Richtlinie Aufruf

<my-directive attrName="foo"> </my-directive> 
+0

dies funktioniert nur mit Strings und vielleicht Bools etc, nicht Objekte, was wahrscheinlich problematisch sein wird. – Millenjo

Verwandte Themen