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?

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]);
    }
}

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.