qual è il significato di '=?' nella direttiva angularJS isolare la dichiarazione di scopo?


127

Il punto interrogativo dopo uguale ha un significato speciale? vale a dire:

scope: {foo: '=?'}

cosa sopra significa 'non generare errore se' pippo 'non può essere risolto?

Risposte:


154

Sì:

L'ambito 'isolare' accetta un hash oggetto che definisce un insieme di proprietà dell'ambito locale derivate dall'ambito padre. Queste proprietà locali sono utili per aliasare i valori per i modelli. La definizione di locali è un hash della proprietà dell'ambito locale alla sua origine:

=oppure =attr- impostare l'associazione bidirezionale tra una proprietà dell'ambito locale e la proprietà dell'ambito padre del nome definita tramite il valore attrdell'attributo. Se non attrviene specificato alcun nome, si presume che il nome dell'attributo sia uguale al nome locale. Dato <widget my-attr="parentModel">e definito la definizione di scope: { localModel:'=myAttr' }, quindi la proprietà dell'ambito del widget localModelrifletterà il valore parentModeldell'ambito principale. Qualsiasi modifica a parentModelverrà riflessa localModele qualsiasi modifica a localModelverrà riflessa parentModel. Se la proprietà dell'ambito padre non esiste, genererà un'eccezione NON_ASSIGNABLE_MODEL_EXPRESSION. È possibile evitare questo comportamento utilizzando =?o =?attrper contrassegnare la proprietà come facoltativa.

Dovrebbe attivare l'errore previsto su ogni digest che influisce sulla proprietà dell'ambito:

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
Ha senso, ma perché questa direttiva non fa eccezione. la proprietà dell'ambito padre non esiste e l'assegnazione dell'ambito NON utilizza un '=?'
Nikita,

7
Sembra lanciare l'errore solo quando il valore è impostato, come qui: plnkr.co/edit/OSpaC6sPE0hY9yAeFghr?p=preview
Matt Zeunert

@cebor Attualmente è collegato nella risposta, ma ecco un link più diretto: docs.angularjs.org/api/ng/service/…
Jason Axelson,

3
Anche se personalmente vorrei che fosse documentato direttamente nella sezione scope e non in $ compilare.
Jason Axelson,

Grazie per la risposta, utilizzo angolare da oltre un anno e non ho mai trovato il "=?" opzione su una direttiva. Hai appena fatto la mia giornata ;-)
Wilblack
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.