4

好吧,这真的让我很烦。我有一个具有隔离范围的指令,使用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等于bar我期望的 HTML 元素的属性值。

当我尝试更改vm.bar使用过滤器的值时,没有任何更改持续存在。

当我将过滤后的值存储vm.bar到一个新变量时vm.baz,它会按预期工作。

这是一个小提琴

所以我的问题有两个部分:

A) 为什么vm.foo使用时 undefined的值'='

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

4

1 回答 1

11

1.4 更改了 bindToController 的工作方式。尽管 angular 的文档似乎仍然将该字段称为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在指令上将作用域设置为具有从其祖先继承的新子作用域。

于 2015-07-07T16:39:37.820 回答