AngularJS 1.4:如何使用bindToController和controllerAs语法

时间:2015-07-07 15:49:44

标签: javascript angularjs angularjs-directive controlleras

好的,这真让我烦恼。我有一个带隔离范围的指令,使用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时,该变量按预期工作。

Here is a fiddle

所以我的问题有两部分:

A)使用vm.foo

时,为什么'='的值未定义?

B)为什么我不能在控制器范围内更改vm.bar的值,即使该更改没有传播到HTML元素属性(它不应该传播,因为我正在使用'@')?

1 个答案:

答案 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,以便拥有一个新的子范围,从而继承它的祖先。