【发布时间】:2025-12-13 23:50:02
【问题描述】:
我有一个控制器,其中包含一个具有隔离范围的指令。每当用户更改指令下拉列表中的值时,我需要通知控制器有关更改。我通过为指令提供回调函数并在指令下拉列表中的 ng-change 事件上调用此函数来做到这一点。我不能(也不想)在父控制器中使用手表,因为我只对用户生成的更改感兴趣。
我的问题是,在调用回调时,控制器范围上的值尚未通过 2-way 绑定更新为指令中的值(我猜这是因为回调是在同一已检测到下拉模型更改的摘要循环,但来自父控制器的模型将仅在后续循环中更新。
这是一个说明问题的 plunker 示例(注意控制台输出):
http://plnkr.co/edit/igW4WiV2niFyrMX2zrjM?p=preview
摘自plunker的相关部分:
控制器:
...
vm.countryChanged = function() {
console.log('*** countryChanged callback ***');
console.log('country:', vm.country); // old value here
$timeout(function() {
console.log('country (inside timeout):', vm.country); // new value here
});
};
...
指令:
...
template: '<select ng-model="vm.country" ng-change="vm.onChange()" ' +
' ng-options="country for country in vm.countries">' +
'</select>',
scope: {
country: '=',
onChange: '&'
},
...
在父控制器回调中获取更新数据的最正确方法是什么?我可以看到 $timeout 有所帮助,但感觉就像是代码异味,可能应该有一种方法可以强制模型在父控制器上更新。
【问题讨论】:
-
尝试指令国家参数作为两种方式
country: '&'
标签: angularjs angular angular-directive angular-components