Was bedeutet '=?' in der angleJS-Direktive Scope-Deklaration isolieren?


127

Hat das Fragezeichen nach gleich eine besondere Bedeutung? dh:

scope: {foo: '=?'}

Bedeutet das oben Gesagte "Fehler nicht auslösen, wenn" foo "nicht behoben werden kann?

Antworten:


154

Ja:

Der Bereich 'isolieren' verwendet einen Objekt-Hash, der eine Reihe lokaler Bereichseigenschaften definiert, die vom übergeordneten Bereich abgeleitet sind. Diese lokalen Eigenschaften sind nützlich für Aliasing-Werte für Vorlagen. Die lokale Definition ist ein Hash der Eigenschaft des lokalen Bereichs für die Quelle:

=oder =attr- eine bidirektionale Bindung zwischen einer lokalen Bereichseigenschaft und der übergeordneten Bereichseigenschaft des Namens einrichten, die über den Wert des attrAttributs definiert wird. Wenn kein attrName angegeben wird, wird angenommen, dass der Attributname mit dem lokalen Namen übereinstimmt. Gegeben <widget my-attr="parentModel">und Widget-Definition von scope: { localModel:'=myAttr' }, dann localModelspiegelt die Widget-Bereichseigenschaft den Wert von parentModelauf dem übergeordneten Bereich wider . Alle Änderungen an parentModelwerden in localModelund alle Änderungen in localModelwerden reflektiert parentModel. Wenn die übergeordnete Bereichseigenschaft nicht vorhanden ist, wird eine NON_ASSIGNABLE_MODEL_EXPRESSION-Ausnahme ausgelöst. Sie können dieses Verhalten vermeiden, indem Sie =?oder verwenden, =?attrum die Eigenschaft als optional zu kennzeichnen.

Es sollte den erwarteten Fehler bei jedem Digest auslösen, der sich auf die Eigenschaft scope auswirkt:

parentSet = parentGet.assign || function() {
// reset the change, or we will throw this exception on every $digest
lastValue = scope[scopeName] = parentGet(parentScope);
     throw Error(NON_ASSIGNABLE_MODEL_EXPRESSION + attrs[attrName] +
     ' (directive: ' + newScopeDirective.name + ')');
};

//...


if (parentValue !== scope[scopeName]) {
    // we are out of sync and need to copy
    if (parentValue !== lastValue) {
        // parent changed and it has precedence
        lastValue = scope[scopeName] = parentValue;
    } else {
        // if the parent can be assigned then do so
        parentSet(parentScope, lastValue = scope[scopeName]);
    }
}

1
Sinnvoll, aber warum löst diese Richtlinie keine Ausnahme aus? Die übergeordnete Bereichseigenschaft ist nicht vorhanden und die Bereichszuweisung verwendet KEIN '=?'
Nikita

7
Es scheint nur den Fehler zu werfen, wenn der Wert eingestellt ist, wie hier: plnkr.co/edit/OSpaC6sPE0hY9yAeFghr?p=preview
Matt Zeunert

@cebor Es ist derzeit in der Antwort verlinkt, aber hier ist ein direkterer Link: docs.angularjs.org/api/ng/service/…
Jason Axelson

3
Obwohl ich persönlich wünschte, es wäre direkt im Scope-Bereich und nicht in $ compile dokumentiert.
Jason Axelson

Vielen Dank für die Antwort. Ich verwende Angular seit mehr als einem Jahr und habe das "=?" Option auf eine Richtlinie. Du hast gerade meinen Tag gemacht ;-)
wilblack
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.