web-dev-qa-db-fra.com

quelle est la signification de '=?' dans la directive angularJS isolate scope déclaration?

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

scope: {foo: '=?'}

ce qui précède signifie-t-il "ne pas générer d'erreur si" foo "ne peut pas être résolu?

124
Nikita

Oui :

La portée "isoler" utilise un hachage d'objet qui définit un ensemble de propriétés de portée locales dérivées de la portée parente. 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 à sa source:

= ou =attr _ - établit une liaison bidirectionnelle entre une propriété de portée locale et la propriété de portée parent du nom défini via la valeur de l'attribut attr. Si aucun attr nom n'est spécifié, le nom de l'attribut est supposé être le même que le nom local. Donné <widget my-attr="parentModel"> et définition du widget scope: { localModel:'=myAttr' }, alors la propriété de portée du widget localModel reflétera la valeur de parentModel sur la portée parente. Toute modification apportée à parentModel sera reflétée dans localModel et toute modification apportée à localModel sera reflétée dans parentModel. Si la propriété de portée parent n'existe pas, une exception NON_ASSIGNABLE_MODEL_EXPRESSION sera renvoyée. Vous pouvez éviter ce comportement en utilisant =? ou =?attr afin de marquer la propriété comme facultative.

Cela devrait déclencher l'erreur attendue sur chaque résumé 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]);
    }
}
152
Matt Zeunert