jakie jest znaczenie „=?” w dyrektywie angularJS izolować deklarację zakresu?

127

Czy znak zapytania po równych ma specjalne znaczenie? to znaczy:

scope: {foo: '=?'}

czy powyższe oznacza „nie zgłaszaj błędu, jeśli„ foo ”nie może zostać rozwiązane?

Nikita
źródło

Odpowiedzi:

154

Tak:

Zakres „izolowany” pobiera skrót obiektu, który definiuje zestaw właściwości zakresu lokalnego pochodzącego z zakresu nadrzędnego. Te właściwości lokalne są przydatne do tworzenia aliasów wartości szablonów. Definicja lokalna to skrót własności zakresu lokalnego do jej źródła:

=lub =attr- skonfiguruj dwukierunkowe wiązanie między właściwością zakresu lokalnego a właściwością zakresu nadrzędnego nazwy zdefiniowaną za pomocą wartości attratrybutu. Jeśli nie attrokreślono nazwy, zakłada się, że nazwa atrybutu jest taka sama jak nazwa lokalna. Podana <widget my-attr="parentModel">definicja widżetu i scope: { localModel:'=myAttr' }właściwość zakresu widżetu localModelbędzie odzwierciedlać wartość parentModelzakresu nadrzędnego. Wszelkie zmiany w programie parentModelzostaną odzwierciedlone w programie, localModela wszelkie zmiany w programie localModelbędą odzwierciedlone w programie parentModel. Jeśli właściwość zakresu nadrzędnego nie istnieje, zgłosi wyjątek NON_ASSIGNABLE_MODEL_EXPRESSION. Możesz uniknąć tego zachowania, używając =?lub =?attrw celu oznaczenia właściwości jako opcjonalnej.

Powinien wywołać oczekiwany błąd w każdym podsumowaniu, który wpływa na właściwość zakresu:

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]);
    }
}
Matt Zeunert
źródło
1
Ma to sens, ale dlaczego ta dyrektywa nie zgłasza wyjątku. właściwość zakresu nadrzędnego nie istnieje, a przypisanie zakresu NIE używa znaku „=?”
Nikita,
7
Wygląda na to, że zgłasza
Matt Zeunert
@cebor Obecnie link znajduje się w odpowiedzi, ale tutaj jest bardziej bezpośredni link: docs.angularjs.org/api/ng/service/ ...
Jason
3
Chociaż osobiście chciałbym, żeby było to udokumentowane bezpośrednio w sekcji zakresu, a nie w $ compile.
Jason Axelson
Dzięki za odpowiedź, używam angulara od ponad roku i nigdy nie znalazłem znaku „=?” opcja dyrektywy. Zrobiłeś mój dzień ;-)
wilblack