angularjs'指令的compile
函数有两个函数:preLink
和postLink
。
预连接功能
在链接子元素之前执行。由于编译器链接功能无法找到正确的链接元素,因此进行DOM转换是不安全的。
后连接功能
链接子元素后执行。在链接后功能中进行DOM转换是安全的。
它告诉我们在preLink
中不应该做什么,我想知道我应该在何时何地使用preLink
?大多数时候我只使用postLink
。有什么情况我们必须使用它吗?
答案 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>