【问题标题】:Why element is not available in directive's link function为什么元素在指令的链接功能中不可用
【发布时间】:2014-10-23 06:05:06
【问题描述】:

你可能已经听过很多次了。 “在指令中进行所有 DOM 操作”。但似乎没有人说过如果你真的在 Angular 中的指令之外进行 DOM 操作会发生什么。

我在Plunk 中设法重现了一个问题

我做了一个非常简单的指令,只是将元素输出到控制台。

app.directive('dirre', function(){
  return {
    link: function(scope, element, attrs){
      console.log({message:"dirrens linkFn", element: element, count: element.length})
    }
  }
});

我有两个相同的 jquery UI 手风琴,唯一的区别是它们的调用方式。一个在控制器中调用,另一个在指令中调用。从控制器调用手风琴当然是不好的。

如您所见,如果您运行该应用程序,则会出现以下情况:其中一个 dirre-directives 似乎没有元素但没有错误。

我现在正在使用的一个大型应用程序中也会发生同样的事情。问题似乎是我们团队中的某个人决定在控制器而不是指令中调用 Jquery UI 的手风琴。 我无法单步执行代码以查看实际发生的情况,但我强烈怀疑 DOM 在 Angular 编译时被修改并且出现了问题。 这是一个合理的解释吗?

如果您在指令之外进行 DOM 操作,这是否是一个可能出错的示例?

【问题讨论】:

    标签: angularjs angular-ui


    【解决方案1】:

    控制器和指令链接函数是异步调用的。 通常您可以在主控制器完成之前看到正在构建的指令。当控制器终止时,指令会更新它们的监视变量(ngModel、$watch(something)...)。基本上这是通过 Promise 完成的。

    但是,链接/编译函数不再被调用。你必须编译、观察、应用新的 DOM。这基本上意味着编写与 angularjs 类似的代码。

    【讨论】:

    • 我发布的示例中显然存在一些可疑之处。该元素在目录的链接功能中不可用,因为它应该是。我不确定你是否在回答这个问题。手风琴的 DOM 操作是否会干扰某些 Angular 进程?
    • 我不相信你说的是对的,当页面加载角度引导程序本身并编译通过所有节点并同步执行指令的文档时,唯一的情况是指令链接/ compile 函数将被异步调用,如果它使用 templateUrl 来获取模板。 '$watch' 表达式在每次 '$digest' 迭代时执行,它与 Promise 无关。要触发 $digest,必须发生 javascript 事件(用户单击元素、XHR 响应等)
    • 你说得对,措辞很糟糕。我没有说链接函数是异步的。我的意思是 maint 控制器在指令完成之前启动。它们不相关。 #accordion 内置在控制器中,因此指令不会看到更改
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 2016-02-26
    • 2015-07-26
    相关资源
    最近更新 更多