Fre*_*ind 37 angularjs angularjs-directive
compileangularjs'指令的功能有两个功能:preLink和postLink.
预连接功能
在子元素链接之前执行.由于编译器链接功能无法找到正确的链接元素,因此进行DOM转换是不安全的.
后连接功能
链接子元素后执行.在链接后功能中进行DOM转换是安全的.
它告诉我们不应该做什么preLink,我想知道什么时候应该使用preLink什么?我刚刚使用过的大部分时间postLink.有什么情况我们必须使用它吗?
iwe*_*ein 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
preLink当指令想要将某些东西放入共享范围内时,就会使用一个函数,以便它可以被其postLink函数中的其他指令使用.
Angular的表单指令,例如,创建一个包含所有输入的条目的对象.自定义指令可以安全地访问postLink函数中的此对象.
在创建包含其他指令的自定义指令时,我不得不使用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>",
...
Run Code Online (Sandbox Code Playgroud)
在这种情况下,Angular将子指令链接到父指令之前,因此我需要使用preLink来设置typeahead.当我在指令postLink函数中初始化$ scope.dropdown和$ scope.editable变量时,我发现当typeahead指令被链接时它们没有被初始化,我不得不将它们的初始化移动到preLink中以使该指令正常工作.
| 归档时间: |
|
| 查看次数: |
10354 次 |
| 最近记录: |