我试图将诺言与观点捆绑在一起。我不知道您是否可以直接执行此操作,但这就是我要尝试执行的操作。有什么想法我做错了吗?
注意:源代码有点超时,并使用静态数据,但这使代码更易于诊断。
编辑: JSFiddle页面:http : //jsfiddle.net/YQwaf/27/
编辑:解决方案:事实证明您可以直接绑定诺言。我的原始代码有两个问题:
- 使用setTimeout()代替angular的$ timeout是一个问题。Angular不知道触发超时时需要刷新UI(您可以在setTimeout内部使用$ scope。$ apply解决此问题,也可以只使用$ timeout)
- 绑定到返回诺言的函数是一个问题。如果第二次被召唤,它将带来另一个承诺。更好的方法是为承诺设置一个范围变量,并仅根据需要创建一个新的承诺。(就我而言,这是在国家/地区代码上调用$ scope。$ watch)
HTML:
<div ng:controller="addressValidationController">
Region Code <select ng:model="regionCode" ng:options="r.code as r.name for r in getRegions()"/>
Country Code<select ng:model="countryCode"><option value="US">United States</option><option value="CA">Canada</option></select>
</div>
JS:
function addressValidationController($scope, $q) {
var regions = {
US: [{code: 'WI',name: 'Wisconsin'}, {code: 'MN',name: 'Minnesota'}],
CA: [{code: 'ON',name: 'Ontario'}]
};
$scope.getRegions = function () {
var deferred = $q.defer();
setTimeout(function () {
var countryRegions = regions[$scope.countryCode];
console.log(countryRegions);
if(countryRegions === undefined) {
deferred.resolve([]);
} else {
deferred.resolve(countryRegions);
}
}, 1000);
return deferred.promise;
};
}