AngularJS docs say :
$ qプロミスは、テンプレートエンジンによって角度で認識されます。つまり、テンプレートでは、スコープにアタッチされたプロミスを、結果の値であるかのように扱うことができます。
それで、誰かがこれの理由を説明できますか フィドル 機能しませんか?テキストフィールドの値を変更することはできません。しかし、$ httpサービスがスコープフィールドに戻るという約束を割り当てることは、魅力のように機能します。
コントローラー:
function MyController($scope, $q, $timeout) {
this.getItem = function () {
var deferred = $q.defer();
deferred.resolve({
title: 'Some title'
});
return deferred.promise;
};
$scope.item = this.getItem();
}
Html:
<input type="text" ng-model="item.title">
Promiseオブジェクトでthen()関数を使用する必要があります。
this.getItem().then(function(result) {
$scope.item = result;
});
あなたの場合、私はあなたが約束を必要としないと思います。 Angularの$ watchシステムが処理を行います。 プリミティブ型ではなく、関数内のオブジェクトを返すだけです :
this.getItem = function () {
var item = {};
// do some async stuff
$http.get(...).success(function(result) {
item.title = result;
});
return item;
};
$scope.item = this.getItem();
最初のフィドルが機能しない理由は、基本的にスコーププロパティitem
をpromiseにバインドしているためだと思います。テキストフィールドに入力して値を変更しようとすると、angularはアクティビティに気づき、item
の値をpromiseの結果に再割り当て/リセットします(これは変更されていません)。
@asgothが提供するソリューションは、promiseが解決されると、item
の値を1回設定/割り当てます。ここではバインディングは行われていません(つまり、item
はpromiseにバインドされていません)。したがって、テキストボックスを介して値を変更すると、値が変更されます。