我们什么时候应该使用`preLink`指令的编译功能?

时间:2013-03-08 15:43:54

标签: angularjs angularjs-directive

angularjs'指令的compile函数有两个函数:preLinkpostLink

  

预连接功能

     

在链接子元素之前执行。由于编译器链接功能无法找到正确的链接元素,因此进行DOM转换是不安全的。

     

后连接功能

     

链接子元素后执行。在链接后功能中进行DOM转换是安全的。

它告诉我们在preLink中不应该做什么,我想知道我应该在何时何地使用preLink?大多数时候我只使用postLink。有什么情况我们必须使用它吗?

3 个答案:

答案 0 :(得分:13)

您几乎不需要使用preLink。可行的情况是,当你需要操作范围内的数据时,但不是DOM 之前执行 link函数(也包括其他指令)。

正如jacob评论的那样,你也可以从控制器那里做到这一点,但有时候在指令本身中使用代码更合适。

有一篇很好的文章介绍了指令如何工作,其中链接顺序很好地解释为:http://www.jvandemo.com/the-nitty-gritty-of-compile-and-link-functions-inside-angularjs-directives/

如果您需要一个很好的示例,说明为什么有时需要预链接,我建议您查看角度指令本身的代码。例如https://github.com/angular/angular.js/blob/master/src/ng/directive/ngModel.js

答案 1 :(得分:7)

当指令想要将某些内容放入共享范围内时,会使用preLink函数,以便它可以被postLink函数中的其他指令使用。< / p>

Angular的form指令,例如,创建一个包含所有输入的条目的对象。自定义指令可以在postLink函数中安全地访问此对象。

答案 2 :(得分:6)

在创建包含其他指令的自定义指令时,我必须使用preLink。在我的例子中,我的指令包括一个模板,该模板将Angular UI Bootstrap的Typeahead指令应用于其某些元素,并使用自己的作用域变量来初始化Typeahead特征。

例如:

...
template:
    "<select ng-show='dropdown' class='form-control' ng-model='ngModel' ng-options='s for s in suggestions'></select>"
    + "<textarea ng-show='!dropdown' class='form-control' ng-model='ngModel' typeahead='s for s in suggestions |filter:$viewValue' typeahead-min-length='0' typeahead-editable='{{editable}}'></textarea>",
...

在这种情况下,Angular将子指令链接到父指令之前,因此我需要使用preLink来设置typeahead。当我在指令postLink函数中初始化$ scope.dropdown和$ scope.editable变量时,我发现当typeahead指令被链接时它们没有被初始化,我不得不将它们的初始化移动到preLink中以使该指令正常工作。 / p>