「約束」のやり方のために、$ httpを使用するサービスの利用者は、応答を解凍する方法を「知っている」必要があるという事実は本当に好きではありません。
$scope.items = Data.getData();
以前の方法と同様に、何かを呼び出してデータを取得したいだけですが、現在は非推奨になっています。
しばらく試してみましたが、完璧な解決策は思いつきませんでしたが、これが私のベストショットです(Plunker)。それは誰かに役立つかもしれません。
app.factory('myService', function($http) {
var _data; // cache data rather than promise
var myService = {};
myService.getData = function(obj) {
if(!_data) {
$http.get('test.json').then(function(result){
_data = result.data;
console.log(_data); // prove that it executes once
angular.extend(obj, _data);
});
} else {
angular.extend(obj, _data);
}
};
return myService;
});
次にコントローラー:
app.controller('MainCtrl', function( myService,$scope) {
$scope.clearData = function() {
$scope.data = Object.create(null);
};
$scope.getData = function() {
$scope.clearData(); // also important: need to prepare input to getData as an object
myService.getData($scope.data); // **important bit** pass in object you want to augment
};
});
私がすでに見つけられる欠陥は
- データを追加するオブジェクトを渡す必要がありますが、これはAngularの直感的または一般的なパターンではありません
getData
オブジェクトの形式でのみobj
パラメータを受け入れることができます(ただし、配列を受け入れることもできます)。これは多くのアプリケーションにとって問題にはなりませんが、それはひどい制限です。
- 入力オブジェクト
$scope.data
を= {}
オブジェクト(基本的に$scope.clearData()
は上記で行うこと)にする= []
ため、または配列用に準備する必要があります。そうしないと、機能しません(どのデータが来るかについてはすでに想定している必要があります)。私はこの準備ステップをINgetData
で実行しようとしましたが、うまくいきませんでした。
それでも、コントローラーの「promise unwrap」ボイラープレートを削除するパターンを提供し、$ httpから取得した特定のデータを、DRYのままで複数の場所で使用する場合に役立つことがあります。