¿Cuál es el significado de '=?' en la declaración de alcance de aislamiento de la directiva angularJS?

127

¿El signo de interrogación después de igual tiene un significado especial? es decir:

scope: {foo: '=?'}

Qué significa lo anterior 'no generar error si' foo 'no se puede resolver?

Nikita
fuente

Respuestas:

154

Si:

El ámbito 'aislar' toma un hash de objeto que define un conjunto de propiedades de ámbito local derivadas del ámbito primario. Estas propiedades locales son útiles para crear alias de valores para plantillas. La definición de locales es un hash de propiedad de ámbito local para su fuente:

=o =attr- configurar un enlace bidireccional entre una propiedad de ámbito local y la propiedad de ámbito principal del nombre definido a través del valor del attratributo. Si no attrse especifica ningún nombre, se supone que el nombre del atributo es el mismo que el nombre local. Dada <widget my-attr="parentModel">y la definición del widget de scope: { localModel:'=myAttr' }, entonces la propiedad del alcance del widget localModelreflejará el valor de parentModelen el alcance padre. Cualquier cambio en parentModelse reflejará en localModely cualquier cambio en localModelse reflejará en parentModel. Si la propiedad del ámbito principal no existe, arrojará una excepción NON_ASSIGNABLE_MODEL_EXPRESSION. Puede evitar este comportamiento usando =?o =?attrpara marcar la propiedad como opcional.

Debe desencadenar el error esperado en cada resumen que afecta la propiedad del alcance:

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
fuente
1
Tiene sentido, pero ¿por qué esta directiva no arroja excepciones? la propiedad del alcance principal no existe y la asignación del alcance NO está usando un '=?'
Nikita
77
Parece que solo arroja el error cuando se establece el valor, como aquí: plnkr.co/edit/OSpaC6sPE0hY9yAeFghr?p=preview
Matt Zeunert
@cebor Actualmente está vinculado en la respuesta, pero aquí hay un enlace más directo: docs.angularjs.org/api/ng/service/…
Jason Axelson
3
Aunque personalmente desearía que se documentara en la sección de alcance directamente y no en $ compile.
Jason Axelson
Gracias por la respuesta, he estado usando angular durante más de un año y nunca encontré el "=?" opción en una directiva. Acabas de
alegrarme el