Angular JS: como se ligar a promessas
Estou tentando vincular uma promessa a uma visão. Eu não sei se você pode fazer isso diretamente, mas é o que eu estou tentando fazer. Alguma idéia do que estou fazendo errado?
Nota: a fonte é um pouco inventada com o tempo limite e usa dados estáticos, mas isso torna o código mais fácil de diagnosticar.
EDITAR: Página JSFiddle:http://jsfiddle.net/YQwaf/27/
EDIT: SOLUÇÃO: Acontece que vocêposso vincular diretamente promessas. Eu tive dois problemas com o meu código original:
Usar setTimeout () em vez do $ timeout do angular foi um problema. Angular não sabe que precisa atualizar a interface do usuário quando o tempo limite é acionado (você pode resolver isso com $ scope. $ Apply dentro de setTimeout, ou você pode apenas usar $ timeout)Ligar a uma função que retornou uma promessa foi um problema. Se for chamado pela segunda vez, isso faz outra promessa. Melhor é definir uma variável de escopo como promessa e criar apenas uma nova promessa, conforme necessário. (No meu caso, isso estava chamando $ scope. $ Watch no código do país)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;
};
}