Javascript 与#x27;控制器'';链接';和';编译';定义指令时的函数
有些地方似乎将控制器功能用于指令逻辑,而另一些地方则使用链接。angular主页上的选项卡示例将控制器用于一个指令,将链接用于另一个指令。这两者的区别是什么 我将稍微扩展一下您的问题,并包括编译函数Javascript 与#x27;控制器'';链接';和';编译';定义指令时的函数,javascript,angularjs,web-applications,javascript-framework,Javascript,Angularjs,Web Applications,Javascript Framework,有些地方似乎将控制器功能用于指令逻辑,而另一些地方则使用链接。angular主页上的选项卡示例将控制器用于一个指令,将链接用于另一个指令。这两者的区别是什么 我将稍微扩展一下您的问题,并包括编译函数 编译函数-用于模板DOM操纵(即操纵tElement=template元素),因此操纵适用于与指令关联的模板的所有DOM克隆。(如果还需要链接函数(或前后链接函数),并且定义了编译函数,则编译函数必须返回链接函数,因为如果定义了'compile'属性,则'link'属性将被忽略。) link函数-
- 编译函数-用于模板DOM操纵(即操纵tElement=template元素),因此操纵适用于与指令关联的模板的所有DOM克隆。(如果还需要链接函数(或前后链接函数),并且定义了编译函数,则编译函数必须返回链接函数,因为如果定义了
属性,则'compile'
属性将被忽略。)'link'
- link函数-通常用于注册侦听器回调(即作用域上的
表达式)以及更新DOM(即操纵iElement=单个实例元素)。它在克隆模板后执行。例如,在一个$watch
内部,链接功能在该特定元素的
模板(tElement)被克隆(到IEElement)后执行。
允许向指令通知作用域属性更改(作用域与每个实例关联),这允许指令向DOM呈现更新的实例值$watch
- 控制器功能-当另一个指令需要与此指令交互时必须使用。例如,在AngularJS主页上,pane指令需要将自身添加到tabs指令维护的范围中,因此tabs指令需要定义pane指令可以访问/调用的控制器方法(想想API)
有关选项卡和窗格指令的更深入解释,以及为什么选项卡指令使用
(而不是this
)在其控制器上创建函数,请参阅$scope
通常,您可以将方法、
$watchs
等放入指令的控制器或链接函数中。控制器将首先运行,这有时很重要(请参阅此日志,其中记录了ctrl和link函数使用两个嵌套指令运行时的情况)。正如Josh在一篇文章中提到的,为了与框架的其余部分保持一致,您可能希望将作用域操纵函数放在控制器中。作为Mark答案的补充,编译函数没有访问作用域的权限,但链接函数有权访问
我真的推荐这个视频;作者Misko Hevery(AngularJS之父),他在书中描述了差异和一些技巧。(编译函数和处的链接函数之间的差异)
<animal>
<panther>
<leopard></leopard>
</panther>
</animal>
将有助于了解指令间通信编译函数-
在控制器和链接函数之前调用
在compile函数中,您拥有原始模板DOM,因此您可以在AngularJS创建其实例和创建作用域之前对原始DOM进行更改
ng repeat是一个完美的例子-原始语法是模板元素,HTML中的重复元素是实例
可以有多个元素实例,但只能有一个模板元素
范围还不可用
编译函数可以返回函数和对象
返回(后链接)函数-相当于在编译函数为空时通过config对象的link属性注册链接函数
返回通过pre和post属性注册函数的对象-允许您控制在链接阶段何时调用链接函数。请参阅下面有关预链接和后链接功能的信息
语法
function compile(tElement, tAttrs, transclude) { ... }
控制器
在编译函数之后调用
范围在这里可用
可由其他指令访问(请参见require属性)
预链接
link函数负责注册DOM侦听器以及更新DOM。它在克隆模板后执行。这就是大多数指令逻辑的位置
可以使用angular.element更新控制器中的dom,但不建议这样做,因为链接函数中提供了元素
Pre-link函数用于实现当angular js已经编译了子元素但在调用子元素的任何post-link之前运行的逻辑
发布链接
指令只具有链接功能,angular将该功能视为post链接
post将在compile、controller和pre-link函数之后执行,因此这被认为是添加指令逻辑的最安全和默认位置
这个解释应该在AngularJS的主要文档中,或者至少是对它的引用。这是一个信息丰富的答案,但我认为它很难阅读。也许更多的标点符号和更小的句子会有所帮助。总的来说,我很感谢您的回答。$编译器在存在“compile”属性时忽略了“link”属性。但是如果存在“controller”属性呢?“controller”是否会导致$compiler忽略“link”和“compile”属性中的一个或两个?是否可能和/或