使用templateUrl指令时的奇怪范围行为

时间:2013-06-25 16:44:41

标签: angularjs angularjs-directive angularjs-scope

所以我有以下简化的plunker来显示我遇到的问题:

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

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

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

我在编译的返回对象pre函数中做出的任何更改是否只有在指令定义了templateUrl属性时才会反映在post函数范围内?

1 个答案:

答案 0 :(得分:1)

这里有两个问题:

1)首先,containerDir创建了隔离范围,因此testOptions span 通过其inputDir无法使用控制器的options绑定并传递undefined

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

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

我建议在修复containerDir的第一个隔离范围绑定问题时,只使用options属性来检索值并使用另一个范围变量来操作数据,以便它没有被覆盖。