ฉันไม่ชอบความจริงที่ว่าเนื่องจากวิธี "สัญญา" ในการทำสิ่งต่าง ๆ ผู้บริโภคของบริการที่ใช้ $ 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()
เหนือกว่า) หรือ= []
สำหรับอาร์เรย์หรือมันจะไม่ทำงาน (เราต้องสมมติบางอย่างเกี่ยวกับข้อมูลที่กำลังจะมา) ฉันพยายามทำขั้นตอนการเตรียมการนี้getData
แต่ก็ไม่มีโชค
อย่างไรก็ตามมันมีรูปแบบที่ลบตัวควบคุม "สัญญาแกะ" และอาจมีประโยชน์ในกรณีที่เมื่อคุณต้องการใช้ข้อมูลบางอย่างที่ได้รับจาก $ http ในมากกว่าหนึ่งที่ในขณะที่ยังคงแห้ง
then
หรือไม่?