好的,这真的很让我烦恼。我有一个带有隔离作用域的指令,使用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
的值为 undefined?
B)为什么我不能在控制器的作用域内更改 vm.bar
的值,即使该更改不会传播到 HTML 元素属性(因为我使用的是 '@')?
bindToController
更改的内容,并尝试使用该语法进行实验。但根据您的答案或我的理解,这应该导致vm.foo
等于MAIN.FOO
,但实际上并不是这样的:http://jsfiddle.net/sscovil/r4esw0a0/ - Shaun ScovilFOO
(通过元素上的foo="FOO"
属性)。 你必须定义FOO
。http://jsfiddle.net/r4esw0a0/2/ 另外,你不应该将所有控制器都命名为vm
,这违反了使用controllerAs
的目的。 http://jsfiddle.net/r4esw0a0/3/ - TheSharpieOnefoo="1+1"
... 当然,它等于2,这是单向绑定,但是如何才能使双向绑定将一个值返回到foo
中呢?https://docs.angularjs.org/error/$compile/nonassign?p0=%27FOO%27&p1=example - TheSharpieOne