Angular JS: как связать с обещаниями

Я пытаюсь связать обещание с представлением. Я не знаю, можете ли вы сделать это напрямую, но это то, что я пытаюсь сделать. Есть идеи, что я делаю не так?

Примечание: источник немного искажен тайм-аутом и использует статические данные, но это облегчает диагностику кода.

РЕДАКТИРОВАТЬ: JSFiddle Page:http://jsfiddle.net/YQwaf/27/

РЕДАКТИРОВАТЬ: РЕШЕНИЕ: Оказалось тыМожно напрямую связывать обещания. У меня было две проблемы с моим исходным кодом:

Использование setTimeout () вместо $ timeout angular было проблемой. 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;
    };
}

Ответы на вопрос(4)

Ваш ответ на вопрос