我有2个控制器(产品)和(ProductsFilters)以及1个服务(ProductService)。
2个控制器正在加载,而第2个控制器(ProductsFilter)作为第一个控制器(产品)的侧面菜单。
Products控制器通过ProductService调用AJAX服务,并将返回的数据分配给ProductService中的变量(Facets)。
同时,ProductsFilter从ProductService检索(Facets)。
现在的问题是,我想在ProductsFilter控制器中处理一些数据,然后才能在视图中显示,但是在执行时,ProductService.Facets会返回一个空对象,因为AJAX调用还没有完成!
我尝试了$ watch()ProductService.Facets,但它没有用。
这是产品服务
.factory('ProductService', function(AppService, CategoryService, $stateParams, $location, $http) {
return {
facets: {},
browse: function(category_id, page, order, order_type) {
url = AppService.apiUrl() + 'products/browse.json?' + params;
var that = this;
return this.getProducts(url).then(function(response) {
that.facets.grouped_brands = response.grouped_brands;
that.facets.grouped_categories = response.grouped_categories;
that.facets.grouped_prices = response.grouped_prices;
that.facets.grouped_stores = response.grouped_stores;
return response;
});
},
getProducts: function(url) {
return $http.jsonp(url + '&callback=JSON_CALLBACK&ref=mobile_app', {cache: true})
.then(function(response) {
if (typeof response.data === 'object') {
return response.data;
}
});
}
}
})
以下是产品控制器:
.controller('ProductsController', function($scope, ProductService) {
$scope.page = 1;
$scope.moreProducts = function() {
ProductService.browse(180, $scope.page)
.then(function(products) {
angular.extend($scope.products, products.products);
$scope.page +=1;
}
);
}
$scope.products = {}
})
这是ProductsFilter控制器:
.controller('ProductsFiltersController', function($scope, ProductService) {
$scope.facets = ProductService.facets;
$scope.brand_facets = []
$scope.$watch('facets', function() {
angular.forEach($scope.facets.grouped_brands, function(value, key) {
$scope.brand_facets.push({brand: key, count: value})
});
});
})
答案 0 :(得分:1)
您可以使用angulars $broadcast
和$on
功能告诉第二个控制器何时收到ajax答案。
如何准确实现广播功能取决于控制器之间的关系。您可以将此SO答案用作帮助:$scope.$emit and .$on angularJS
答案 1 :(得分:0)
听起来您的服务中存在异步错误。您需要让AJAX请求的回调将数据返回给控制器,或者使用$ q创建一个promise,该promise将返回给控制器。
https://docs.angularjs.org/api/ng/service/ $ Q
$ q允许您创建延迟对象。因此,不是返回null对象的服务,它将返回一个承诺,控制器一旦完成就可以执行操作。