1. ホーム
  2. angularjs

[解決済み] angularJS ディレクティブのスコープ分離宣言の「=?」の意味は?

2022-07-27 14:33:31

質問

イコールの後のクエスチョンマークは特別な意味を持つのでしょうか。

scope: {foo: '=?'}

は「'foo'が解決できない場合はエラーを発生させない」という意味でしょうか?

どのように解決するのですか?

はい、そうです。

<ブロッククオート

isolate' スコープは、親スコープから派生したローカルスコーププロパティのセットを定義するオブジェクトハッシュを取ります。これらのローカルプロパティは、テンプレートの値をエイリアスするのに便利です。ローカルスコープの定義は、ローカルスコープのプロパティをそのソースにハッシュ化したものです。

= または =attr - ローカルスコープの の値で定義された名前の親スコーププロパティとの間で双方向のバインディングを設定します。 の attr 属性の値で定義された name の親スコーププロパティとの間の双方向バインディングを設定します。もし 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]);
    }
}