web-dev-qa-db-ja.com

AngularJSの約束

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">
10
Raman Chodźka

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();
14
asgoth

最初のフィドルが機能しない理由は、基本的にスコーププロパティitemをpromiseにバインドしているためだと思います。テキストフィールドに入力して値を変更しようとすると、angularはアクティビティに気づき、itemの値をpromiseの結果に再割り当て/リセットします(これは変更されていません)。

@asgothが提供するソリューションは、promiseが解決されると、itemの値を1回設定/割り当てます。ここではバインディングは行われていません(つまり、itemはpromiseにバインドされていません)。したがって、テキストボックスを介して値を変更すると、値が変更されます。

1
Mark Rajcok