qual é o significado de '=?' na diretiva angularJS isolar declaração de escopo?

127

O ponto de interrogação depois de igual tem um significado especial? ou seja:

scope: {foo: '=?'}

o acima significa 'não gerar erro se' foo 'não puder ser resolvido?

Nikita
fonte

Respostas:

154

Sim:

O escopo 'isolar' usa um hash de objeto que define um conjunto de propriedades de escopo local derivadas do escopo pai. Essas propriedades locais são úteis para criar alias de valores para modelos. A definição de locais é um hash da propriedade de escopo local para sua origem:

=ou =attr- configurar a ligação bidirecional entre uma propriedade de escopo local e a propriedade de escopo pai de nome definida por meio do valor do attratributo. Se nenhum attrnome for especificado, será assumido que o nome do atributo seja o mesmo que o nome local. Dada <widget my-attr="parentModel">e a definição do scope: { localModel:'=myAttr' }widget, a propriedade do escopo do widget localModelrefletirá o valor parentModelno escopo pai. Quaisquer alterações parentModelserão refletidas localModele quaisquer alterações localModelserão refletidas parentModel. Se a propriedade do escopo pai não existir, lançará uma exceção NON_ASSIGNABLE_MODEL_EXPRESSION. Você pode evitar esse comportamento usando =?ou =?attrpara sinalizar a propriedade como opcional.

Ele deve disparar o erro esperado em cada resumo que afeta a propriedade do escopo:

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
fonte
1
Faz sentido, mas por que essa diretiva não gera exceção. a propriedade do escopo pai não existe e a atribuição do escopo NÃO está usando um '=?'
Nikita
7
Parece apenas para jogar o erro quando o valor estiver definido, como aqui: plnkr.co/edit/OSpaC6sPE0hY9yAeFghr?p=preview
Matt Zeunert
@cebor É atualmente vinculado na resposta, mas aqui é uma ligação mais directa: docs.angularjs.org/api/ng/service/...
Jason Axelson
3
Embora pessoalmente eu deseje que ele tenha sido documentado na seção de escopo diretamente e não no $ compile.
Jason Axelson
Obrigado pela resposta, uso angular há mais de um ano e nunca encontrei o "=?" opção em uma diretiva. Você só fez o meu dia ;-)
wilblack