use*_*259 391 javascript web-applications javascript-framework angularjs
有些地方似乎使用控制器功能用于指令逻辑而其他地方使用链接.角度主页上的选项卡示例使用控制器作为一个,并链接另一个指令.两者有什么区别?
Mar*_*cok 631
我将稍微扩展你的问题,并包括编译功能.
编译函数 - 用于模板 DOM操作(即操作tElement = template元素),因此适用于与指令关联的模板的所有DOM克隆的操作.(如果还需要链接函数(或前后链接函数),并且定义了编译函数,则编译函数必须返回链接函数,因为'link'
如果'compile'
定义了属性,则忽略该属性.)
链接函数 - 通常用于注册侦听器回调(即$watch
作用域上的表达式)以及更新DOM(即,操作iElement =单个实例元素).它在克隆模板后执行.例如,在an中<li ng-repeat...>
,在将<li>
模板(tElement)克隆到该特定<li>
元素(到iElement)之后执行链接功能.A $watch
允许指令通知范围属性更改(范围与每个实例关联),这允许指令将更新的实例值呈现给DOM.
controller函数 - 当另一个指令需要与该指令交互时必须使用.例如,AngularJS主页上,窗格指令需要将自身添加到由标签指令维护的范围,因此标签指令需要定义一个控制器方法(认为API),该窗格指令可以访问/调用.
有关tab和pane指令的更深入说明,以及tabs指令使用this
(而不是on $scope
)在其控制器上创建函数的原因,请参阅AngularJS控制器中的'this'vs $ scope.
通常,您可以将方法$watches
等放入指令的控制器或链接函数中.控制器将首先运行,这有时很重要(当ctrl和link函数使用两个嵌套指令运行时,请参阅此小提琴.正如Josh在评论中提到的那样,您可能希望将范围操作函数放在控制器中,以便与框架的其余部分保持一致.
Rah*_*hul 35
Angular约定:在控制器中编写业务逻辑,在链接中编写DOM操作.
除此之外,您可以从另一个指令的链接函数调用一个控制器函数.例如,您有3个自定义指令
<animal>
<panther>
<leopard></leopard>
</panther>
</animal>
Run Code Online (Sandbox Code Playgroud)
并且你想从"豹子"指令里面访问动物.
http://egghead.io/lessons/angularjs-directive-communication将有助于了解指令间的沟通
编译功能 -
句法
function compile(tElement, tAttrs, transclude) { ... }
Run Code Online (Sandbox Code Playgroud)
调节器
预先链接
link函数负责注册DOM侦听器以及更新DOM.它在克隆模板后执行.这是大多数指令逻辑的用武之地.
您可以使用angular.element更新控制器中的dom,但不建议这样做,因为链接函数中提供了元素
预链接函数用于实现逻辑,该逻辑在角度js已经编译子元素但在调用任何子元素的post链接之前运行
后链接
只有链接函数的指令,angular将函数视为post link
post将在编译,控制器和预链接函数之后执行,这就是为什么这被认为是添加指令逻辑的最安全和默认的地方
归档时间: |
|
查看次数: |
111799 次 |
最近记录: |