指令回调和作用域

Directives callbacks and scope

本文关键字:作用域 回调 指令      更新时间:2023-09-26

我正试图在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>

我们的指令不需要关心父作用域如何到达一个值——只关心最终的值是什么

所以我们可以用它来让父作用域对指令做出反应,或者让指令对父作用域做出反应——所有这些都可以用灵活的表达式。整洁。

因此,=用于确保数据绑定;它确保使用指令的作用域和指令本身在某个变量上保持同步。&允许在父作用域的上下文中求值表达式,并允许指令或父作用域对潜在的复杂状态变化做出反应。