Angular JS: Wie man sich an Versprechen bindet

Ich versuche, ein Versprechen an eine Ansicht zu binden. Ich weiß nicht, ob Sie das direkt tun können, aber das ist, was ich versuche zu tun. Irgendwelche Ideen, was ich falsch mache?

Hinweis: Die Quelle ist ein wenig mit der Zeitüberschreitung konstruiert und verwendet statische Daten. Dies erleichtert jedoch die Diagnose des Codes.

BEARBEITEN: JSFiddle Seite:http://jsfiddle.net/YQwaf/27/

EDIT: LÖSUNG: Es hat sich herausgestellt, dass Siekönnen Versprechen direkt binden. Ich hatte zwei Probleme mit meinem Originalcode:

Die Verwendung von setTimeout () anstelle des $ timeout von angular war ein Problem. Angular weiß nicht, dass die Benutzeroberfläche aktualisiert werden muss, wenn das Timeout ausgelöst wird (Sie können dies mit $ scope lösen. $ Innerhalb von setTimeout anwenden, oder Sie können einfach $ timeout verwenden).Das Binden an eine Funktion, die ein Versprechen zurückgab, war ein Problem. Wenn es ein zweites Mal aufgerufen wird, gibt es noch ein weiteres Versprechen. Besser ist es, eine Bereichsvariable für das Versprechen festzulegen und nur bei Bedarf ein neues Versprechen zu erstellen. (In meinem Fall hieß das $ scope. $ Watch in der Ländervorwahl)

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

Antworten auf die Frage(4)

Ihre Antwort auf die Frage