【问题标题】:Weird scope behavior when using templateUrl directives使用 templateUrl 指令时的奇怪范围行为
【发布时间】:2013-06-22 14:00:52
【问题描述】:

所以我有以下简化的 plunker 来显示我在使用我的指令时遇到的问题:

http://plnkr.co/edit/aXW7YlpensjcYsLTGwmo?p=preview

这有一个指令,它使用 compile 属性并返回一个带有 pre/post 函数的对象。我遇到的问题是,当我在指令上使用 templateUrl 属性时,我对 pre 函数中的范围所做的任何更改都不会反映在 post 函数传入的范围中。

plunker 有控制台日志,因此如果您打开控制台,您会注意到记录了一个对象和未定义的对象,即在 compile 属性中返回对象的 pre 和 post 函数中记录 scope.options。如果你打开 app.js 并注释掉 templateUrl 定义,你会得到同一个对象的 2 个日志,它不再在帖子中未定义。这在使用模板属性时也有效。

只有当指令定义了 templateUrl 属性时,我在编译的返回对象前函数中所做的更改是否有任何原因不会反映在后函数范围中?

【问题讨论】:

    标签: javascript html angularjs angularjs-directive angularjs-scope


    【解决方案1】:

    这里有两个问题:

    1) 首先是containerDir 创建了隔离作用域,因此控制器的testOptions 通过其options 绑定对inputDir 不可用span,而是传递undefined .

    2) 第二个与您的问题更相关的是,options 操作使用了隔离范围绑定,该绑定似乎在不同时间进行了评估(链接前和链接后)。您对变量所做的更改似乎会在下次评估绑定时被覆盖。

    在预链接方法中,绑定被评估为未定义(因为 testOptions 由于问题 #1 而未定义。该未定义值然后被您的预链接中的某些代码覆盖。然后,当链接执行,我认为绑定再次被评估,options 再次设置为undefined

    我建议除了使用containerDir 修复第一个隔离范围绑定问题外,您还可以仅使用options 属性来检索值并使用另一个范围变量来操作数据,以免它被覆盖。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-24
      • 1970-01-01
      • 1970-01-01
      • 2017-09-12
      • 2014-09-24
      • 1970-01-01
      相关资源
      最近更新 更多