我正试图围绕 angularjs 中的范围进行思考,特别是在使用指令的模块上调用回调时。我找到了 3 种不同的方法来完成同一件事,并且我试图了解每种方法的优缺点。
什么时候适合直接在父对象上使用、或调用函数&
?=
我更喜欢使用 '=' 符号绑定,因为指令和托管指令的模块中所需的代码更少,但根据文档(了解 Transclusion 和 Scopes),似乎使用 绑定到回调&
是首选方法, 为什么?
我正试图围绕 angularjs 中的范围进行思考,特别是在使用指令的模块上调用回调时。我找到了 3 种不同的方法来完成同一件事,并且我试图了解每种方法的优缺点。
什么时候适合直接在父对象上使用、或调用函数&
?=
我更喜欢使用 '=' 符号绑定,因为指令和托管指令的模块中所需的代码更少,但根据文档(了解 Transclusion 和 Scopes),似乎使用 绑定到回调&
是首选方法, 为什么?
好问题。应该首先从尝试分离您的关注点的角度做出这些决定。所以我们必须消除在父作用域上调用方法——指令必须对父作用域了解太多。
接下来,我们看看目的。根据定义,回调是方法。&
在父作用域的上下文中计算表达式,而双向绑定只是一个变量名。&
功能更强大,并为您的指令的用户提供了更大的灵活性。当然,他们可以这样做,就像在你的例子中一样:
<my-dir cb="callMe()"></my-dir>
但他们也可以这样做:
<my-dir cb="myVar = false"></my-dir>
我们不必传入变量的名称——它是任何AngularJS表达式。因此,组件的用户可以自由地以适合他们的任何方式对您的事件做出反应。惊人的!
而且,该指令可以对状态变化做出反应。例如,您可以检查一个条件:
<my-dir cb="myVar"></my-dir>
并且myVar
可以评估任何值,并且您的指令可以在任何时候意识到这种变化并做出相应的反应。您不是共享一个变量,而是共享一个表达式。在这种情况下,双向绑定可以工作,但如果指令不(也许不应该)更改该变量,为什么我们需要双向绑定?
但同样,它不必是一个变量。计算结果为真或假的表达式怎么样?
<my-dir cb="myVar == myOtherVar"></my-dir>
我们的指令不必关心父作用域是如何得到一个值的——只关心这个值最终是什么。
因此,我们可以将它用于父作用域以对指令做出反应,或者让指令对父作用域做出反应——所有这些都具有灵活的表达式。整洁的。
所以,=
是为了确保数据绑定;它确保使用指令的范围和指令本身在某个变量上保持同步。&
允许在父范围的上下文中评估表达式,并允许指令或父范围对潜在的复杂状态更改做出反应。