что означает "=?" в объявлении области действия директивы angularJS?

127

Имеет ли вопросительный знак после «равно» особое значение? то есть:

scope: {foo: '=?'}

означает ли вышесказанное «не вызывать ошибку, если« foo »не может быть разрешено?

Никита
источник

Ответы:

154

Да:

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

=или =attr- установить двунаправленную привязку между свойством локальной области и свойством родительской области с именем, определенным через значение attrатрибута. Если attrимя не указано, предполагается, что имя атрибута совпадает с локальным именем. Учитывая <widget my-attr="parentModel">и определение виджета scope: { localModel:'=myAttr' }, тогда свойство области виджета 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]);
    }
}
Мэтт Зойнерт
источник
1
Имеет смысл, но почему эта директива не генерирует исключение. Свойство родительской области не существует, и назначение области НЕ использует знак '=?'
Никита
7
Кажется, выдает
Мэтт Зойнерт
@cebor В настоящее время он связан в ответе, но вот более прямая ссылка: docs.angularjs.org/api/ng/service/…
Джейсон Аксельсон
3
Хотя лично мне хотелось бы, чтобы это было задокументировано непосредственно в разделе области видимости, а не в $ compile.
Джейсон Аксельсон
Спасибо за ответ, я использую angular более года и так и не нашел "=?" вариант по директиве. Ты только что сделал мне день ;-)
wilblack