“ =”是什么意思?在angularJS指令隔离范围声明?


127

等号后的问号有特殊含义吗?即:

scope: {foo: '=?'}

上面的意思是“无法解决'foo'时不会引发错误?”

Answers:


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
是有道理的,但是为什么该指令不抛出异常。父范围属性不存在,并且范围分配未使用'=?'
Nikita 2013年

7
似乎只有在设置该值时才会引发错误,例如:plnkr.co/edit/OSpaC6sPE0hY9yAeFghr?p=preview
Matt Zeunert

@cebor它在回答当前链接,但这里是一个更直接的联系:docs.angularjs.org/api/ng/service/...
贾森Axelson

3
尽管我个人希望它直接在scope部分中记录,而不是在$ compile中记录。
Jason Axelson

感谢您的回答,我已经使用angular一年多了,却从未找到过“ =?” 指令上的选项。您刚刚
赢得
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.