Javascript 使用templateUrl指令时的奇怪作用域行为

Javascript 使用templateUrl指令时的奇怪作用域行为,javascript,html,angularjs,angularjs-directive,angularjs-scope,Javascript,Html,Angularjs,Angularjs Directive,Angularjs Scope,因此,我使用以下简化的plunker来说明我的指令存在的问题: 它有一个使用compile属性并返回带有pre/post函数的对象的指令。我遇到的问题是,当我在指令上使用templateUrl属性时,我在pre函数中对作用域所做的任何更改都不会反映在post函数传入的作用域中 plunker具有控制台日志,因此,如果打开控制台,您将注意到有一个对象已记录,未定义,这是在compile属性内返回对象的pre和post函数中记录scope.options。如果你打开app.js并注释掉templa

因此,我使用以下简化的plunker来说明我的指令存在的问题:

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

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


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

这里有两个问题:

1) 第一个是
containerDir
创建隔离作用域,因此控制器的
testOptions
通过其
options
绑定对
inputDir
范围不可用,而是传递
undefined

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

在pre-link方法中,绑定被评估为未定义(因为
testOptions
由于问题#1而未定义。该未定义的值随后会被pre-link中的一些代码覆盖。然后,在执行post-link时,我认为绑定会再次评估,
options
再次被设置为
未定义

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