我们什么时候应该使用伪指令的编译函数的preLink?

angularjs指令的compilefunction有两个function: preLinkpostLink

预链接function

在子元素链接之前执行。 由于编译器链接函数将无法find正确的链接元素,因此不安全地进行DOM转换。

后链接function

子元素链接后执行。 在后链接function中做DOM转换是安全的。

它告诉我们不应该在preLink做什么,我想知道什么时候应该使用preLink ? 大部分时间我只是使用postLink 。 有什么情况需要使用吗?

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

正如jacob所评论的那样,你总是可以从控制器那里做到这一点,但是有时在代码中有代码更合适。

有一篇关于指令是如何工作的优秀文章,链接顺序可以很好地解释为: http : //www.jvandemo.com/the-nitty-gritty-of-compile-and-link-functions-inside-angularjs-directives/

如果您需要一个很好的例子来说明为什么预连接有时是必要的,那么我build议您查看一下angular指令本身的代码。 例如angular/angular.js/blob/master/src/ng/directive/ngModel.html

当指令想要把某些东西放到一个共享的作用域中时, preLink函数就会被使用,这样它就可以被其他的指令在postLink函数中使用了。

Angular的表单指令,例如,创build一个包含所有input条目的对象。 自定义指令可以在postLink函数中安全地访问这个对象。

在创build包含其他指令的自定义指令时,我不得不使用preLink。 就我而言,我的指令包含一个模板,它将Angular UI Bootstrap的Typeahead指令应用到它的一些元素,并使用它自己的作用域variables来初始化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来设置指针。 当我在命令postLink函数中初始化$ scope.dropdown和$ scope.editablevariables时,发现它们在链接前面的指令时没有初始化,我不得不将它们的初始化移动到preLink中,以使这个指令正常工作。