これは1万回質問されるかもしれませんが、この問題に対する適切な解決策はまだ見つかりません。
私はちょうど$http
をAPI(またはJSONファイル)から非同期的にフェッチするために、サービスからデータを取得するコントローラの古典的な例を持っています。コントローラ内のデータはサービス内のオブジェクトへの参照であるため、サービスが完了した時点でデータが変更されることを期待していたため、ビューが更新されることを期待していました。下のスニペットで見ることができるように、ビューは初期値を保持します。
このように、私の二つの質問:
- これは良好なパターンますか?コントローラが複数存在し、特定の時点でデータを再フェッチする必要があるとします(コントローラで更新される)。
- ビューが更新されないのはなぜですか?
$ scope(可能な場合)や$ rootSscope、$ watchも使用しないことに注意してください。
var app = angular.module('myApp', [])
.service('Service', ['$http', service])
.controller('Controller', ['Service', controller]);
function controller(Service){
var c = this;
c.items = [
{'title': 'Default title1'},
{'title': 'Default title2'}
];
c.items = Service.data;
}
function service($http, $scope){
var data = [
{'title': 'olddatatitle'}
];
$http({
method: 'GET',
url: 'https://jsonplaceholder.typicode.com/posts?userId=1',
cache: true
}).then(function(response){
data = response.data;
});
return {
data: data
}
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myApp" >
<ul ng-controller="Controller as c">
<li ng-repeat="item in c.items">
{{item.title}}
</li>
</ul>
</div>
$のHTTP呼び出しは、あなたのコード内で非同期に実行されます。 returnステートメントは、$ httpを呼び出した直後に発生し、 'then'は後で発生します。データを更新するためのコールバックを提供するか、または約束を返し、呼び出し元に自分のコールバックを指定させる必要があります。 – Igor
[非同期呼び出しから応答を返すにはどうすればよいですか?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – Igor