яке значення '=?' у 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
Здається, помилка видається лише тоді, коли встановлено значення, наприклад тут: plnkr.co/edit/OSpaC6sPE0hY9yAeFghr?p=preview
Matt Zeunert

@cebor На даний момент пов'язано у відповіді, але ось пряме посилання: docs.angularjs.org/api/ng/service/…
Джейсон Аксельсон,

3
Хоча особисто я хотів би, щоб це було зафіксовано безпосередньо в розділі обсягу, а не в $ compile.
Джейсон Аксельсон

Дякую за відповідь, я використовую кутовий вже більше року і жодного разу не знайшов "=?" опція на директиву. Ви щойно зробили мій день ;-)
wilblack
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.