更新:肯定是代码的另一部分出了些愚蠢的问题。现在它正常工作了,因此 bindToController 语法没问题。
我们正在使用 AngularJS 1.4,该版本引入了指令中使用 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
。 - Joe Pontanidir
引用了元素:<input type="number" ng-model="dir.address.streetNumber">
。我编辑了主贴以澄清这一点。谢谢。 - Leo Lozes