指令回调和作用域
Directives callbacks and scope
我正试图在angularjs中围绕作用域进行思考,特别是在使用指令的模块上调用回调时。我已经找到了三种不同的方法来完成同样的事情,我正在努力了解每种方法的优缺点。
给定这个plnkr
什么时候适合使用&
, =
,或者直接在父节点上调用函数?
我更喜欢与'='符号绑定,因为在指令和托管指令的模块中需要的代码较少,但根据文档(理解Transclusion和scope),似乎与&
绑定回调是首选方法,为什么?
问得好。这些类型的决定应该首先从试图分离你的关注点的角度来做。因此,我们必须消除在父作用域上调用方法——指令必须知道太多关于父作用域的信息。
接下来,我们来看看目的。从定义上讲,回调是方法。&
在父作用域的上下文中计算表达式,而双向绑定只是一个变量名。&
是一个批次更强大,给你的指令用户更大的灵活性。当然,他们可以这样做,就像你的例子:
<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>
我们的指令不需要关心父作用域如何到达一个值——只关心最终的值是什么。
所以我们可以用它来让父作用域对指令做出反应,或者让指令对父作用域做出反应——所有这些都可以用灵活的表达式。整洁。因此,=
用于确保数据绑定;它确保使用指令的作用域和指令本身在某个变量上保持同步。&
允许在父作用域的上下文中求值表达式,并允许指令或父作用域对潜在的复杂状态变化做出反应。
- Javascript变量作用域:从回调函数中提取变量
- 将回调绑定到没有隔离作用域的指令
- 作用域,在回调中丢失对对象的引用
- 使用JavaScript回调函数了解变量作用域和闭包
- 无法在 $.post 回调中设置作用域变量
- jquery ajax 回调变量作用域(为什么有些在作用域中,而另一些则不在作用域中)
- Javascript 局部和全局变量在回调函数中失去作用域
- 在Ajax回调中,局部变量是否仍在作用域中
- 订阅子作用域上的事件,并在broadcastemit中返回回调
- 描述从回调方法获取正确的作用域
- 如何用javascript将作用域传递给我的ajax回调函数
- 回调函数中的变量作用域呢
- 未定义来自不同作用域变量的javascript回调函数
- 如何将作用域传递给节点mysql中的回调
- 访问子元素内的父作用域's onclick回调(Atom包)
- 回调函数中的变量作用域
- 全局变量在回调中定义后不在作用域中
- Javascript在成功回调时将变量保持在作用域中(jquery/backbonejs/parse函数)
- 进行OO javascript回调时的作用域
- 作为闭包的回调中的Javascript变量作用域