Tôi thực sự không thích thực tế rằng, vì cách thực hiện "lời hứa", người tiêu dùng dịch vụ sử dụng $ http phải "biết" về cách giải nén phản hồi.
Tôi chỉ muốn gọi một cái gì đó và lấy dữ liệu ra, tương tự như $scope.items = Data.getData();
cách cũ , hiện không được dùng nữa .
Tôi đã thử một lúc và không đưa ra được giải pháp hoàn hảo, nhưng đây là bức ảnh đẹp nhất của tôi ( Plunker ). Nó có thể hữu ích cho một ai đó.
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;
});
Sau đó, bộ điều khiển:
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
};
});
Lỗ hổng tôi có thể phát hiện ra là
- Bạn phải truyền vào đối tượng mà bạn muốn dữ liệu được thêm vào , đây không phải là mẫu trực quan hoặc phổ biến trong Angular
getData
chỉ có thể chấp nhận obj
tham số ở dạng đối tượng (mặc dù nó cũng có thể chấp nhận một mảng), điều này sẽ không phải là vấn đề đối với nhiều ứng dụng, nhưng đó là một hạn chế đau
- Bạn cần phải chuẩn bị những đối tượng đầu vào
$scope.data
với = {}
để làm cho nó một đối tượng (thực chất là những gì $scope.clearData()
làm ở trên), hoặc = []
cho một mảng, hoặc nó sẽ không làm việc (chúng tôi đã phải thừa nhận điều gì đó về những dữ liệu đang đến). Tôi đã cố gắng thực hiện bước chuẩn bị này VÀO getData
, nhưng không có may mắn.
Tuy nhiên, nó cung cấp một mẫu loại bỏ bản tóm tắt "hứa hẹn không điều khiển" của bộ điều khiển và có thể hữu ích trong trường hợp khi bạn muốn sử dụng một số dữ liệu nhất định thu được từ $ http ở nhiều nơi trong khi vẫn giữ DRY.
then
không?