2013-05-15 2 views
25

Gibt es eine Möglichkeit, Variablen mithilfe von Attributen an eine Anweisung zu übergeben, ohne einen neuen Bereich zu erstellen?Übergabe der Variablen an die Richtlinienvorlage, ohne einen neuen Bereich zu erstellen

HTML

<div ng-click='back()' button='go back'></div> 

JS

.directive('button', function() { 
    return { 
     scope: { 
      button: '@' 
     }, 
     template: "<div><div another-directive></div>{{button}}</div>", 
     replace: true 
    } 
}) 

Das Problem ist, dass die ng-click='back()' bezieht sich nun auf die Richtlinie Anwendungsbereich. Ich kann immer noch tun ng-click='$parent.back()', aber es ist nicht das, was ich will.

+0

sollten Sie & attr verwenden, um übergeordnete Funktionen aufzurufen, die als Attribut übergeben wurden http://stackoverflow.com/questions/15991137/calling-method-of-parent-controller-from-a-directive-in-angularjs/15991525 –

+0

I möchte eine generische Art haben. Nicht 'Umfang: {zurück: '&'}' wenn es das ist, was du meinst? Um zu tun: '

' für ein anderes Beispiel. –

Antwort

32

Standardmäßig erstellen Richtlinien keinen neuen Bereich. Wenn Sie, dass explizit machen möchten, fügen Sie scope: false zu Ihrer Richtlinie:

<div ng-click='back()' button='go back!'></div> 
angular.module('myApp').directive("button", function() { 
    return { 
     scope: false, // this is the default, so you could remove this line 
     template: "<div><div another-directive></div>{{button}}</div>", 
     replace: true, 
     link: function (scope, element, attrs) { 
      scope.button = attrs.button; 
     } 
    }; 
}); 

fiddle

Da eine neue Eigenschaft, button wird auf den Rahmen geschaffen werden, sollten Sie in der Regel erstellen new kind scope mit scope: true als @ ardentum-c hat in seiner Antwort. Der neue Bereich wird prototypially inherit aus dem übergeordneten Bereich, weshalb Sie $parent.back() in Ihrem HTML nicht einfügen müssen.

Ein weiterer Leckerbissen zu erwähnen: Obwohl wir replace: true verwenden, klicken Sie auf das Element immer noch ruft back(). Das funktioniert, weil "der Ersetzungsprozess alle Attribute/Klassen vom alten Element zum neuen migriert". - directive doc
So ng-click='back()' button='go back!' werden auf die erste div in der Vorlage der Richtlinie migriert.

+0

Sie haben Recht, aber ich brauche den isolierten Bereich, um mehrere Schaltflächen mit unterschiedlichen Namen zu haben. Schlecht formulierte Frage, denke ich. http://jsfiddle.net/gHjU4/2/ –

+0

OK jetzt fühle ich mich dumm, wie Sie sagten, 'Scope: true' und keine Kompilierung benötigt. Ich habe die angenommene Antwort geändert. –

2

Ich denke, Sie sollten in diesem Fall kompilieren Funktion verwenden.

angular.module('myApp').directive("button", function() { 
    return { 
     template: "<div><div another-directive></div>{{button}}</div>", 
     replace: true, 
     scope: true, 
     compile: function (tElement, tAttrs) { 
      // this is link function 
      return function (scope) { 
       scope.button = tAttrs.button; 
      };    
     } 
    }; 
}); 

Hier ist jsfiddle example.

+0

Ich habe nie zuvor kompiliert, aber ich sah es in der Dokumentation, sollte es lesen. Vielen Dank ! –

+1

'scope: true' erstellt einen neuen Bereich. Während ich der Meinung bin, dass dies der richtige Weg ist, hat das OP keinen neuen Anwendungsbereich gefordert. Auch eine Kompilierfunktion ist nicht notwendig, nur eine Linkfunktion. Siehe meine Antwort für weitere Informationen. –

Verwandte Themen