所以我有以下简化的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函数范围内?
答案 0 :(得分:1)
这里有两个问题:
1)首先,containerDir
创建了隔离范围,因此testOptions
span 通过其inputDir
无法使用控制器的options
绑定并传递undefined
。
2)第二个与你的问题更相关的是,options
操作使用隔离范围绑定,似乎在不同时间(链接前和链接后)进行评估。您对变量所做的更改似乎会在下次评估绑定时被覆盖。
在pre-link方法中,绑定被评估为未定义(因为testOptions
由于问题#1而未定义。那么未定义的值会被预链接中的某些代码覆盖。然后,当后链接执行,我认为再次评估绑定,options
再次设置为undefined
。
我建议在修复containerDir
的第一个隔离范围绑定问题时,只使用options
属性来检索值并使用另一个范围变量来操作数据,以便它没有被覆盖。