10

AngularJSのドキュメントによると

$ 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">
4

3 に答える 3

14

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();
于 2012-12-29T10:31:53.057 に答える
1

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

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

于 2012-12-29T18:07:46.020 に答える
-1

@Markが言ったように、ここにスニペットの実例があります。

基本的に、オブジェクトを返し、モデル自体をバインドしていませんでした。

$timeout(function(){
   $scope.item = {
      title: 'Some title'
   }; // Apply the binding
   deferred.resolve(); // Resolve promise
},2000); // wait 2 secs           
于 2012-12-29T19:36:03.933 に答える