I am trying to bind a promise to a view. I don't know if you can do that directly, but that's what I'm attempting to do. Any ideas what I am doing wrong?
Note: the source is a little contrived with the timeout and uses static data, but that's to make the code easier to diagnose.
EDIT: JSFiddle Page: http://jsfiddle.net/YQwaf/27/
EDIT: SOLUTION: It turned out you can directly bind promises. I had two problems with my original code:
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; }; }
As of Angular 1.2, you can't use promises in templates directly anymore.
Instead, you need to put the result into $scope
inside then
, like you normally would—no magic.
As a temporary workaround to get the old behavior, you can call
$parseProvider.unwrapPromises(true)
but this feature will be removed later on, so don't depend on it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With