【发布时间】:2015-10-29 22:58:21
【问题描述】:
更新:在代码的另一部分一定是愚蠢的。它现在可以工作了,所以 bindToController 语法很好。
我们使用的是 AngularJS 1.4,它在指令中引入了 new way to use bindToController。
经过大量阅读(可能还没有完全理解所有内容),我们这样定义指令:
.directive('mdAddress', function mdAddress() {
var directive = {
restrict: 'EA',
scope: {},
bindToController: {
address: '='
},
templateUrl: 'modules/address/address.html',
controller: AddressController,
controllerAs: 'dir'
};
像这样从另一个视图调用它:
<md-address address="vm.address"></md-address>
已经在视图控制器中定义了:
vm.address = {
street: null,
countryCode: null,
cityCode: null,
postalCode: null
};
像这样引用指令模板中的变量:
<md-input-container>
<label>{{'ADDRESSNUMBER' | translate}}</label>
<input type="number" ng-model="dir.address.streetNumber">
</md-input-container>
我们花了 4 小时试图弄清楚为什么我们的指令不起作用。好吧,它可以工作,但是控制器和指令之间的双向绑定没有,vm.address.street 被无可救药地设置为 null。
一段时间后,我们只是尝试了旧方法:
.directive('mdAddress', function mdAddress() {
var directive = {
restrict: 'EA',
scope: {
address: '='
},
bindToController: true,
templateUrl: 'modules/address/address.html',
controller: AddressController,
controllerAs: 'dir'
};
它神奇地起作用了。知道为什么?
【问题讨论】:
-
您的
modules/address/address.html模板中有什么?如果您试图在模板中完全引用vm,那么这将导致空问题,因为vm在您的指令范围内不存在。此外,如果您试图仅绑定到指令模板中的address,那么当您将控制器绑定为dir时,它也不存在,所以它必须是dir.address -
在模板中我们引用了
dir的元素:<input type="number" ng-model="dir.address.streetNumber">。我编辑了主要帖子以澄清这一点。谢谢。 -
请为这两种情况提供两个 plunker。对此有简单的解释,但纯文本并不能清楚地说明您到底做了什么。
-
我在升级到 1.4+ 之前遇到了类似的问题。任何可能的原始问题仍然引用旧版本的 Angular?
-
嗯,这是可能的,尽管我很确定我们在尝试之前更改了角度版本。现在很难说:)
标签: javascript angularjs angularjs-directive angularjs-scope