如何在AngularJS中的2个控制器之间交换AJAX数据

时间:2014-06-05 13:45:39

标签: angularjs

我有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})
    });
  });
})

2 个答案:

答案 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对象的服务,它将返回一个承诺,控制器一旦完成就可以执行操作。