...
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>",
...
3 回答
你几乎不需要使用
preLink
. 可行的情况是,在执行link
函数(也是其他指令)之前,需要操作范围内的数据 but not the DOM .正如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
当指令想要将某些东西放入 shared 范围内时,可以使用
preLink
函数,以便它可以被postLink
函数中的其他指令使用 .Angular的表单指令,例如,创建一个包含所有输入的条目的对象 . 自定义指令可以安全地在
postLink
函数中访问此对象 .在创建包含其他指令的自定义指令时,我不得不使用preLink . 在我的例子中,我的指令包括一个模板,该模板将Angular UI Bootstrap的Typeahead指令应用于其某些元素,并使用自己的范围变量来初始化Typeahead功能 .
例如:
在这种情况下,Angular将子指令链接到父指令之前,因此我需要使用preLink来设置typeahead . 当我在指令postLink函数中初始化$ scope.dropdown和$ scope.editable变量时,我发现当typeahead指令被链接时它们没有被初始化,我不得不将它们的初始化移动到preLink中以使该指令正常工作 .