好的,这真让我烦恼。我有一个带隔离范围的指令,使用controllerAs
语法和bindToController
:
function exampleDirectiveFactory() {
var bindings = {
foo: '=',
bar: '@'
}
return {
bindToController: true,
controller : 'ExampleController',
controllerAs : 'vm',
scope : bindings,
template : 'foo = {{ vm.foo }}<br />bar = {{ vm.bar }}'
};
}
假设有这样的用法:
<example foo="FOO" bar="BAR"></example>
...我希望vm.foo
的值与foo
属性的值双向绑定。相反,它是undefined
。
vm.bar
的值等于HTML元素的属性值bar
,我期待。
当我尝试使用过滤器更改vm.bar
的值时,不会继续更改。
当我将过滤后的vm.bar
值存储到新变量vm.baz
时,该变量按预期工作。
所以我的问题有两部分:
A)使用vm.foo
?
'='
的值未定义?
B)为什么我不能在控制器范围内更改vm.bar
的值,即使该更改没有传播到HTML元素属性(它不应该传播,因为我正在使用'@'
)?
答案 0 :(得分:11)
1.4改变了bindToController的工作方式。虽然有角度的文档似乎仍然将该字段称为true
/ false
。现在,它可以像scope
属性一样接受一个对象,其中属性指示您想要绑定的内容以及如何绑定它。
function exampleDirectiveFactory() {
var bindings = {
foo: '=',
bar: '@'
}
return {
bindToController: bindings, //<-- things that will be bound
controller : 'ExampleController',
controllerAs : 'vm',
scope : {}, //<-- isolated scope
template : 'foo = {{ vm.foo }}<br />bar = {{ vm.bar }}'
};
}
此外,在你的小提琴中,FOO在父作用域上是undefined
,因此当它绑定时,它会将undefined
拉入指令的绑定控制器的作用域
进一步阅读:
这个新的bindToController
语法允许的一个主要问题是指令不是一个孤立的范围,仍然可以识别绑定的内容。实际上,你可以在你的指令上将范围设置为true
,以便拥有一个新的子范围,从而继承它的祖先。