Я пытаюсь связать обещание с представлением. Я не знаю, можете ли вы сделать это напрямую, но это то, что я пытаюсь сделать. Любые идеи, что я делаю неправильно?
Примечание: источник немного надуман с таймаутом и использует статические данные, но это облегчает диагностику кода.
EDIT: Страница JSFiddle: http://jsfiddle.net/YQwaf/27/
РЕДАКТИРОВАТЬ: РЕШЕНИЕ: Оказалось, что может напрямую связывать promises. У меня было две проблемы с моим исходным кодом:
- Использование setTimeout() вместо angular $timeout было проблемой. angular не знает, что ему нужно обновить пользовательский интерфейс при запуске таймаута (вы можете решить это с помощью $scope. $apply внутри setTimeout или просто использовать $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;
};
}