Что означает "=?" в angularJS директива изолировать декларацию области?

Значит ли знак вопроса после равных иметь особое значение? то есть:

scope: {foo: '=?'}

означает ли это выше, "не поднимать ошибку, если" foo "не может быть разрешено?

Ответ 1

Да:

Область "isolate" принимает хеш объекта, который определяет набор свойств локальной области, полученных из родительской области. Эти локальные свойства полезны для значений псевдонимов для шаблонов. Определение локальных локалей - это хэш локального свойства scope к его источнику:

= или =attr - установить двунаправленную привязку между локальной областью свойство и свойство родительской видимости имени, определенного через значение атрибута attr. Если не указано имя attr, тогда имя атрибута считается таким же, как локальное имя. Данный <widget my-attr="parentModel"> и определение виджета scope: { localModel:'=myAttr' }, тогда свойство scope widget localModel будет отражают значение parentModel в родительской области. Любые изменения в parentModel будет отражено в localModel, и любые изменения в localModel отразится в parentModel. Если родительская область свойства не существует, оно Исключение NON_ASSIGNABLE_MODEL_EXPRESSION. Вы можете избежать такого поведения используя =? или =?attr, чтобы указать свойство как необязательное.

Он должен вызывать ожидаемую ошибку в каждом дайджесте, который влияет на свойство области:

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]);
    }
}