【发布时间】:2016-02-17 07:54:05
【问题描述】:
我在网上查了几个解决方案,但我不太明白如何阻止控制器加载。所以,我创建了一个 plunkr 来突出我想要做的事情。
基本上:我想将所有数据加载到服务中,然后将该数据从该服务传递到每个控制器。当应用第一次加载时,因为它是异步的,所以首先加载控制器。
我本可以在每个控制器中使用工厂,但我想将该数据保存在服务的“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;
}
]);
【问题讨论】:
-
谢谢,鲍勃。是的,我知道那个实现,尽管在控制器中调用
productsFactory.getProds(function(data){$scope.myProducts = data})的代码会更少,而无需通过服务 - 我的兴趣是是否有解决方案只调用一次 http 请求,在服务和将数据保存在变量中,然后将其传递给控制器。谢谢
标签: javascript angularjs service controller factory