JS angular: cómo vincularse a las promesas

Estoy tratando de atar una promesa a una vista. No sé si puedes hacer eso directamente, pero eso es lo que bash hacer. ¿Alguna idea de lo que estoy haciendo mal?

Nota: la fuente es un poco artificial con el tiempo de espera y utiliza datos estáticos, pero eso hace que el código sea más fácil de diagnosticar.

EDITAR: JSFiddle Page: http://jsfiddle.net/YQwaf/27/

EDITAR: SOLUCIÓN: Resultó que puedes vincular directamente las promesas. Tuve dos problemas con mi código original:

  1. Utilizar setTimeout () en lugar del tiempo de espera de angular $ fue un problema. Angular no sabe que necesita actualizar la UI cuando se dispara el tiempo de espera (Puede resolver esto con $ scope. $ Apply dentro de setTimeout, o simplemente puede usar $ timeout)
  2. La vinculación a una función que devolvió una promesa fue un problema. Si se llama por segunda vez, hace otra promesa. Mejor es establecer una variable de scope para la promesa y solo crear una nueva promesa según sea necesario. (En mi caso, esto llamaba $ scope. $ Watch en el código de país)

HTML:

Region Code Country CodeUnited StatesCanada

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; }; } 

ADVERTENCIA : esta respuesta fue precisa cuando fue escrita, pero a partir de 1.2 el motor de plantilla angular no maneja las promesas de manera transparente. – @Malvolio

Sí, el motor de plantillas (y expresiones) maneja las promesas de manera transparente, pero asigno la promesa a una propiedad de scope en el controlador y no llamo cada vez a una función que devuelve una nueva promesa (creo que es su problema, la promesa resuelta se pierde porque un nuevo la promesa se devuelve cada vez).

JSFiddle: http://jsfiddle.net/YQwaf/36/

HTML:

 
Region Code Country Code

JS:

 function addressValidationController($scope, $q, $timeout) { var regions = { US: [{ code: 'WI', name: 'Wisconsin'}, { code: 'MN', name: 'Minnesota'}], CA: [{ code: 'ON', name: 'Ontario'}] }; function getRegions(countryCode) { console.log('getRegions: ' + countryCode); var deferred = $q.defer(); $timeout(function() { var countryRegions = regions[countryCode]; if (countryRegions === undefined) { console.log('resolve empty'); deferred.resolve([]); } else { console.log('resolve'); deferred.resolve(countryRegions); } }, 1000); return deferred.promise; }; $scope.regions = []; // Manage country changes: $scope.$watch('countryCode', function(countryCode) { if (angular.isDefined(countryCode)) { $scope.regions = getRegions(countryCode); } else { $scope.regions = []; } }); }​