quelle est la signification de '=?' dans la directive angularJS isoler la déclaration de portée?

127

Le point d'interrogation après égal a-t-il une signification particulière? c'est à dire:

scope: {foo: '=?'}

est-ce que ce qui précède signifie 'ne pas déclencher d'erreur si' toto 'ne peut pas être résolu?

Nikita
la source

Réponses:

154

Oui:

La portée 'isolate' prend un hachage d'objet qui définit un ensemble de propriétés de portée locale dérivées de la portée parent. Ces propriétés locales sont utiles pour créer des alias pour les valeurs des modèles. La définition locale est un hachage de la propriété de portée locale vers sa source:

=ou =attr- configurer une liaison bidirectionnelle entre une propriété de portée locale et la propriété de portée parente de nom définie via la valeur de l' attrattribut. Si aucun attrnom n'est spécifié, le nom d'attribut est supposé être le même que le nom local. Étant donné <widget my-attr="parentModel">et la définition du widget de scope: { localModel:'=myAttr' }, la propriété d'étendue du widget localModelreflètera la valeur de parentModelsur l'étendue parent. Toute modification de parentModelsera reflétée dans localModelet toute modification de localModelsera reflétée dans parentModel. Si la propriété d'étendue parent n'existe pas, elle lèvera une exception NON_ASSIGNABLE_MODEL_EXPRESSION. Vous pouvez éviter ce comportement en utilisant =?ou =?attrpour marquer la propriété comme facultative.

Il doit déclencher l'erreur attendue sur chaque condensé qui affecte la propriété scope:

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
la source
1
Cela a du sens, mais pourquoi cette directive ne lance- t-elle pas une exception? la propriété d'étendue parent n'existe pas et l'attribution d'étendue n'utilise PAS un '=?'
Nikita
7
Il semble ne lancer l'erreur que lorsque la valeur est définie, comme ici: plnkr.co/edit/OSpaC6sPE0hY9yAeFghr?p=preview
Matt Zeunert
@cebor Il est actuellement lié dans la réponse, mais voici un lien plus direct: docs.angularjs.org/api/ng/service/…
Jason Axelson
3
Bien que personnellement, je souhaite que cela soit documenté directement dans la section scope et non dans $ compile.
Jason Axelson
Merci pour la réponse, j'utilise angular depuis plus d'un an et je n'ai jamais trouvé le "=?" option sur une directive. Vous venez de faire ma journée ;-)
wilblack