2015-11-21 5 views
6

私はサーバーにオブジェクトのコレクションを持っています。ページが読み込まれたときにng-repeatを設定します。

私はそうのように、サーバー上のリソースからリストをフェッチ作っ工場だった:私は、UI-ルータとでresolveプロパティを使用した場合の前にこのコードの動作を持っていた

app.factory('objectArray', ['$http', function($http) { 
     // This is returning a $$state object 
     // instead of response.data... 
     return $http.post('/get_collection').then(function(response) { 
      console.log(response.data); 
      return response.data; 
     }); 
    }]); 

を州の宣言しかし、私のコントローラに直接このファクトリを注入すると、response.dataを取得する代わりに$$状態オブジェクトが取得されます。

私のコントローラは、次のようになります。

app.controller('applicationController', ['$scope', 'objectArray', function($scope, objectArray) { 
    $scope.array = objectArray; 
    console.log($scope.array); 
}]); 
+0

可能な複製?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call); ([this duplicate](http://stackoverflow.com/questions/22951208/return-value-after-a-promise)も参照してください) – Kenney

+0

@Kenney私は、これが何の問題もなく角度ui-routerで動作するのが最も興味があります追加コードですが、この場合は{$$ state:object} –

+0

ですが、わかりませんが、[Promise.then']から値を返すことはできません(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then)。あなたのアプローチは[this](https://github.com/angular-ui/ui-router/issues/77)のようなものでしたか? – Kenney

答えて

8

$ HTTPサービスの戻り(ひいてはobjectArrayサービスですが)約束と呼ばれるもの。 httpリクエストに応答が戻ってサーバから来るときあなたはすなわち、データが利用可能になったときに呼び出されるコールバック関数を登録することで、実際のデータにアクセスすることができます。

objectArray.then(function(data) { 
    $scope.array = data; 
}); 

あなたが直接アクセスすることができた理由を解決を使用するときデータに解決機能が約束を返すとき、ルーターは約束が解決されるのを待つことです。そしてそれだけで、それは約束からデータを抽出し、そのデータをコントローラに注入する。

約束を理解するために、the following article(およびそのsequel)を読むことができます。

3

@JB Nizetが気づいたとして、あなたのコードは結構です、ちょうどここでデモに働いているコントローラ でそれを解決する

angular.module('app', []); 
 
angular.module('app').factory('objectArray', ['$http', function($http) { 
 
    // This is returning a $$state object 
 
    // instead of response.data... 
 
    ////// changed request type and url for the sake of example 
 
    return $http.get('http://jsonplaceholder.typicode.com/posts/1') 
 
.then(function(response) { 
 
    console.log(response.data); 
 
    return response.data; 
 
}); 
 
}]); 
 
angular.module('app').controller('applicationController', ['$scope', 'objectArray', function($scope, objectArray) { 
 
    //////resolve it here 
 
    objectArray.then(function(successResponse){ 
 
    $scope.array = successResponse; 
 
    console.log($scope.array); 
 
    }); 
 
}]); 
 
angular.bootstrap(document.body, ['app']);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-controller="applicationController"> 
 
    <h5>Hello {{array.title}}</h5> 
 
</div>

私は非同期呼び出しからの応答を返すにはどうすればよい[の
+1

HTTP応答の約束ではなく、(約束の連鎖による)データの約束を返すことは、実際には良いことです。 OPの工場は完璧だった。 –

+0

そして、2番目の例は悪い考えです。http要求が失敗したかどうかを知る方法は今や呼び出し側にありません。また、http://blog.ninja-squad.com/2015/05/28/angularjs-promises/ –

+0

@JBNizetも読んでください.2つの例では、2つのコールバックが必要であり、更新された回答もなければならない確かに –

関連する問題