首页 文章

我们什么时候应该使用`preLink`指令的编译功能?

提问于
浏览
37

angularjs'指令的 compile 函数有两个函数: preLinkpostLink .

预链接功能在子元素链接之前执行 . 由于编译器链接功能无法找到正确的链接元素,因此进行DOM转换是不安全的 . 链接后功能链接子元素后执行 . 在链接后功能中进行DOM转换是安全的 .

它告诉了我们不应该在 preLink 做什么,我想知道什么时候应该使用 preLink ?大多数时候我只使用 postLink . 有什么情况我们必须使用它吗?

3 回答

  • 6

    你几乎不需要使用 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

  • 7

    当指令想要将某些东西放入 shared 范围内时,可以使用 preLink 函数,以便它可以被 postLink 函数中的其他指令使用 .

    Angular的表单指令,例如,创建一个包含所有输入的条目的对象 . 自定义指令可以安全地在 postLink 函数中访问此对象 .

  • 13

    在创建包含其他指令的自定义指令时,我不得不使用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中以使该指令正常工作 .

相关问题