我已經在網上查了幾個解決方案,但我不太明白如何停止加載控制器。所以,我創建了一個強調突出我想要做的事情。Angularjs:在服務中加載數據然後將其加載到控制器
基本上:我想加載服務中的所有數據,然後將該服務中的數據傳遞給每個控制器。當應用程序第一次加載時,因爲它是異步的,控制器首先被加載。
我可以只使用工廠的每個控制器,但我想保持在該服務的「allProducts」屬性數據。每次加載視圖時,我都沒有看到需要調用工廠函數。
在這個例子中,我也試着用$ Q服務,但在我看來,它具有相同的行爲就像從工廠的HTTP,仍然需要調用每個視圖負載HTTP請求......
那麼,有人可以幫助我這個例子,並實施一個優雅的解決方案?
app.factory('productsFactory', ['$http', '$q',
function($http, $q) {
var cachedData; //here we hold the data after the first api call
function getData(callback) {
if (cachedData) {
callback(cachedData);
} else {
$http.get('http://api.bestbuy.com/v1/products(longDescription=iPhone*|sku=7619002)?show=sku,name&pageSize=15&page=5&apiKey=bqs7a4gwmnuj9tq6bmyysndv&format=json')
.success(function(data) {
cachedData = data; //caching the data in a local variable
callback(data);
});
}
}
return {
getProds: getData
}
}
])
app.service('appService', ['productsFactory', '$q',
function(productsFactory, $q) {
var _this = this;
productsFactory.getProds(function(data) {
_this.allProducts = data; //wait for data to load before loading the controllers
})
}
])
app.controller('productsCtrl', ['$scope', 'appService',
function($scope, appService) {
$scope.myProducts = appService.allProducts;
}
]);
plunkr在這裏:當它可用http://plnkr.co/edit/ZvtYwXHSasC3fCAZKkDF?p=preview
選中此項:http://plnkr.co/edit/x90U7d0wzkSeCVNu3Vdl?p=preview –
謝謝,鮑勃。是的,我知道這個實現,儘管只需要在控制器中調用'productsFactory.getProds(function(data){$ scope.myProducts = data})'而不用通過服務 - 我的興趣是如果有一種解決方案只需調用一次http請求,並將數據保存在變量中,然後將其傳遞給控制器。謝謝 –