在定义指令时,“controller”、“link”和“compile”函数之间的区别

20 浏览
0 Comments

在定义指令时,“controller”、“link”和“compile”函数之间的区别

一些地方似乎在指令逻辑中使用控制器函数,而其他地方使用链接。Angular主页上的标签示例对一个指令使用控制器函数,对另一个指令使用链接。两者之间有什么区别?

admin 更改状态以发布 2023年5月21日
0
0 Comments

作为马克回答的补充,编译函数没有访问作用域的权限,但连接函数有。

我真的推荐这个视频;写指令,由AngularJS之父Misko Hevery制作,他在视频中描述了一些区别和技巧。(在视频的14:41处观看链接函数和编译函数的区别)。

0
0 Comments

我想扩展一下你的问题,还包括编译函数。

  • 编译函数-用于模板DOM操作(即,与指令相关联的模板的所有DOM克隆的操作),因此应用于所有DOM克隆。 (如果您还需要链接函数(或预链接函数和后链接函数),并且定义了编译函数,则编译函数必须返回链接函数,因为如果定义了'compile'属性,则会忽略'link'属性。)

  • 链接函数-通常用于注册侦听器回调(即,作用于作用域上的$watch表达式),以及更新DOM(即,单个实例元素的操作)。模板被克隆后执行。例如,在< li ng-repeat…>内部,链接函数在将< li>模板(tElement)克隆(成为iElement)以用于特定的< li>元素之后执行。 $watch允许指令接收到作用域属性更改的通知(每个实例都有一个作用域),这允许指令将更新的实例值呈现到DOM中。

  • 控制器函数-必须在另一个指令需要与此指令交互时使用。例如,在AngularJS主页上,窗格指令需要将自身添加到由选项卡指令维护的作用域中,因此选项卡指令需要定义一个控制器方法(即API),以便窗格指令可以访问/调用。

    有关选项卡和窗格指令的更深入的解释以及选项卡指令使用this(而不是$scope)在其控制器上创建函数的原因,请参见 'this' vs $scope in AngularJS controllers

通常,您可以将方法,$watches等放入指令的控制器或链接函数中。控制器将首先运行,这有时很重要(请参见这个fiddle,其中记录了两个嵌套指令的ctrl和link函数运行的情况)。正如Josh在评论中提到的,您可能希望将作用域操作功能放在控制器中,以保持与框架的其余部分的一致性。

0