该compile
angularjs'指令的功能有两个功能: preLink
和postLink
。
预链接功能
子元素被链接之前执行。 没有安全做DOM转型,因为编译器链接功能将无法找到正确的元素联系起来。
联邮功能
子元素被链接后执行。 它是安全的DOM转型中的连接后功能。
它告诉我们不应该做preLink
,我不知道什么时候应该使用preLink
? 对于大多数的时候我只是用postLink
。 有,我们必须使用它的情况下?
该compile
angularjs'指令的功能有两个功能: preLink
和postLink
。
预链接功能
子元素被链接之前执行。 没有安全做DOM转型,因为编译器链接功能将无法找到正确的元素联系起来。
联邮功能
子元素被链接后执行。 它是安全的DOM转型中的连接后功能。
它告诉我们不应该做preLink
,我不知道什么时候应该使用preLink
? 对于大多数的时候我只是用postLink
。 有,我们必须使用它的情况下?
你需要几乎从来不使用preLink
。 可行的情况下,它是当你需要操纵范围的数据, 而不是DOM, 之前 link
被执行功能(也是其他指令)。
雅各评论,你总是可以做到这一点从控制器太多,但有时它必须在指令本身的代码是比较合适的。
有一个关于指令的工作的优秀文章,其中的连接顺序很好地解释说: 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
功能。
角的形式指令,例如,创建一个包含所有输入项的对象。 自定义指令可以安全地在访问该对象postLink
功能。
我已经创建自定义的指令,其中包括其他指令时使用预链接。 就我而言,我的指令,其中包括应用角度UI引导的指令事先键入的内容到它的一些元素,并使用它自己的范围内的变量初始化功能,事先键入的内容的模板。
例如:
...
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>",
...
在这种情况下,角链接父之后的子指令,所以我需要使用预链接来设置预输入。 当我初始化的指令postLink功能$ scope.dropdown和$ scope.editable变量,我发现当预输入指令有联系,他们没有初始化,我不得不为其初始化进入预链接正确地使该指令工作。