Verwendung der Symbole '@', '&', '=' und '>' in der Bereichsbindung der benutzerdefinierten Direktive: AngularJS

151

Ich habe viel über die Verwendung dieser Symbole bei der Implementierung benutzerdefinierter Anweisungen in AngularJS gelesen, aber das Konzept ist mir immer noch nicht klar. Ich meine, was bedeutet es, wenn ich einen der Bereichswerte in der benutzerdefinierten Direktive verwende?

var mainApp = angular.module("mainApp", []);
mainApp.directive('modalView',function(){
  return{
     restrict:'E',
     scope:'@' OR scope:'&' OR scope:'=' OR scope:'>' OR scope:true
  }
});

Was genau machen wir hier mit dem Umfang?

Ich bin mir auch nicht sicher, ob "scope: '>'" in der offiziellen Dokumentation vorhanden ist oder nicht. Es wurde in meinem Projekt verwendet.

Edit-1

Die Verwendung von "scope: '>'" war ein Problem in meinem Projekt und wurde behoben.

MAC
quelle

Antworten:

116

In einer AngularJS-Direktive können Sie mit dem Bereich auf die Daten in den Attributen des Elements zugreifen, auf das die Direktive angewendet wird.

Dies wird am besten anhand eines Beispiels veranschaulicht:

<div my-customer name="Customer XYZ"></div>

und die Richtliniendefinition:

angular.module('myModule', [])
.directive('myCustomer', function() {
  return {
    restrict: 'E',
    scope: {
      customerName: '@name'
    },
    controllerAs: 'vm',
    bindToController: true,
    controller: ['$http', function($http) {
      var vm = this;

      vm.doStuff = function(pane) {
        console.log(vm.customerName);
      };
    }],
    link: function(scope, element, attrs) {
      console.log(scope.customerName);
    }
  };
});

Wenn die scopeEigenschaft verwendet wird, befindet sich die Direktive im sogenannten "isolierten Bereich" -Modus, was bedeutet, dass sie nicht direkt auf den Bereich des übergeordneten Controllers zugreifen kann.

In sehr einfachen Worten ist die Bedeutung der Bindungssymbole:

someObject: '=' (bidirektionale Datenbindung)

someString: '@'(direkt oder durch Interpolation mit doppelter geschweifter Klammer {{}})

someExpression: '&'(zB hideDialog())

Diese Informationen sind auf der Dokumentationsseite der AngularJS-Direktive enthalten , obwohl sie auf der gesamten Seite etwas verteilt sind.

Das Symbol >ist nicht Teil der Syntax.

Existiert <jedoch als Teil der AngularJS-Komponentenbindungen und bedeutet Einwegbindung.

VRPF
quelle
6
Was ist mit @??
Homer
9
Es sollte beachtet werden, dass dies <nicht nur mit Komponenten in 1.5 kompatibel ist, sondern auch mit Direktiven. @Homer the ?bezeichnet das Attribut als optional .
Jens Bodal
171

> ist nicht in der Dokumentation.

< ist für die Einwegbindung.

@Bindung dient zum Übergeben von Zeichenfolgen. Diese Zeichenfolgen unterstützen {{}}Ausdrücke für interpolierte Werte.

=Die Bindung dient zur bidirektionalen Modellbindung. Das Modell im übergeordneten Bereich ist mit dem Modell im isolierten Bereich der Richtlinie verknüpft.

& Beim Binden wird eine Methode in den Geltungsbereich Ihrer Direktive übergeben, damit sie innerhalb Ihrer Direktive aufgerufen werden kann.

Wenn wir in der Direktive scope: true festlegen, erstellt Angular js einen neuen Gültigkeitsbereich für diese Direktive. Das bedeutet, dass Änderungen am Richtlinienbereich nicht im übergeordneten Controller berücksichtigt werden.

Aravind
quelle
47

< Einwegbindung

= Zweiwegebindung

& Funktionsbindung

@ Übergeben Sie nur Zeichenfolgen

Timothy.Li
quelle
6
Es macht keinen Sinn, dieselbe Antwort zu wiederholen. Tut mir leid, nicht dieselbe Antwort. Es scheint eine extrahierte Information aus den obigen Antworten zu sein.
MAC
19
Manchmal ist eine kürzere Antwort praktischer!
Marwen Trabelsi
Keine Notwendigkeit, Junk-Informationen hinzuzufügen, wenn Sie es in wenigen kurzen Zeilen erklären können :)
Marwen Trabelsi
1
Dies wäre besser als eine Bearbeitung gewesen, um eine der höher bewerteten Optionen zu führen.
N-ate
3

Wenn wir eine Kundenrichtlinie erstellen, kann der Geltungsbereich der Direktive isoliert sein. Dies bedeutet, dass die Direktive keinen Geltungsbereich mit dem Controller teilt. Sowohl die Richtlinie als auch der Controller haben ihren eigenen Geltungsbereich. Daten können jedoch auf drei Arten an den Richtlinienbereich übergeben werden.

  1. Daten können als Zeichenfolge übergeben werden, indem das @Zeichenfolgenliteral, der Zeichenfolgenwert und die Einwegbindung verwendet werden.
  2. Daten können als Objekt mit dem =String-Literal übergeben werden, Objekt übergeben, 2-Wege-Bindung.
  3. Daten können als Funktion übergeben werden. Das &String-Literal ruft eine externe Funktion auf und kann Daten von der Direktive an die Steuerung übergeben.
Bac Nguyen
quelle
2

Die AngularJS-Dokumentation zu Direktiven ist ziemlich gut geschrieben, was die Symbole bedeuten.

Um klar zu sein, können Sie nicht einfach haben

scope: '@'

in einer Richtliniendefinition. Sie müssen Eigenschaften haben, für die diese Bindungen gelten, wie in:

scope: {
    myProperty: '@'
}

Ich empfehle Ihnen dringend, die Dokumentation und die Tutorials auf der Website zu lesen. Es gibt viel mehr Informationen, die Sie über isolierte Bereiche und andere Themen wissen müssen.

Hier ist ein direktes Zitat von der oben verlinkten Seite zu den Werten von scope:

Die Eigenschaft scope kann true, ein Objekt oder ein falscher Wert sein:

  • Falsy : Für die Richtlinie wird kein Geltungsbereich erstellt. Die Richtlinie verwendet den Geltungsbereich ihrer Eltern.

  • true: Für das Element der Direktive wird ein neuer untergeordneter Bereich erstellt, der prototypisch von seinem übergeordneten Bereich erbt. Wenn mehrere Anweisungen für dasselbe Element einen neuen Bereich anfordern, wird nur ein neuer Bereich erstellt. Die neue Bereichsregel gilt nicht für den Stamm der Vorlage, da der Stamm der Vorlage immer einen neuen Bereich erhält.

  • {...} (ein Objekt-Hash) : Für das Element der Direktive wird ein neuer Bereich "Isolieren" erstellt. Der Bereich "Isolieren" unterscheidet sich vom normalen Bereich darin, dass er nicht prototypisch von seinem übergeordneten Bereich erbt. Dies ist nützlich, wenn Sie wiederverwendbare Komponenten erstellen, die nicht versehentlich Daten im übergeordneten Bereich lesen oder ändern sollten.

Abgerufen am 13.02.2017 von https://code.angularjs.org/1.4.11/docs/api/ng/service/ $ compile # -scope-, lizenziert als CC-by-SA 3.0

Ketzeraffe
quelle
0

Ich hatte Probleme, einen Wert mit einem der Symbole in AngularJS 1.6 zu binden. Ich habe überhaupt keinen Wert erhalten, nur undefinedobwohl ich es genauso gemacht habe wie andere Bindungen in derselben Datei, die funktioniert haben.

Problem war: Mein Variablenname hatte einen Unterstrich.

Dies schlägt fehl:

bindings: { import_nr: '='}

Das funktioniert:

bindings: { importnr: '='}

(Nicht vollständig mit der ursprünglichen Frage verwandt, aber das war eines der besten Suchergebnisse, als ich es mir ansah. Hoffentlich hilft dies jemandem mit dem gleichen Problem.)

Maurits
quelle