如何在我的情况下设置Angular http调用

时间:2015-03-20 15:47:27

标签: javascript angularjs http

我正在尝试设置服务来设置http请求数据。 我需要在一个控制器中设置数据,并在加载该页面时获取另一个控制器中的数据 我有类似

的东西
angular.module('myApp').service('testService', ['Product','$q',
    function(Product, $q) {
        var products, targetProduct;
        var deferred = $q.defer();

        Product.query({
            Id: 123
            }, function(products) {
                targetProduct = products[0];
                deferred.resolve(products);
        })

        var getTargetProduct = function() {
            var deferredtwo = $q.defer();

            // return deferredtwo.promise;
            deferred.promise.then(function(){
                deferredtwo.resolve(targetProduct);
            })
            return deferredtwo.promise;
        }

        var setTargetProduct = function(targetProduct) {
                targetProduct = targetProduct
        }

        return {
            setTargetProduct: setTargetProduct,
            getTargetProduct: getTargetProduct,
            productPromise : deferred.promise
        };
    }
]);

导航控制器

  testService.productPromise.then(function(products, $rootscope){
      $scope.products= products;
      $scope.targetProduct = products[0];
   })

  //when user click the project  ng-click = setTargetProduct(product);
  $scope.setTargetProduct = function(targetProduct) {
      $rootscope.$broadcast('newProduct' targetProduct);
      testService.setTargetProduct(targetProduct)
   }

产品细节控制器

 testService.getTargetProduct().then(function(targetProduct) {
       $scope.$on('newProduct', function(newProduct){
          console.log(newProduct) <---works if both controllers are loaded but undefined if user is not in the product detail page.
       })  
       $scope.targetProduct = targetProduct; 
  })

但是,如果用户单击setTargetProduct时尚未加载产品详细信息控制器(用户位于不同的页面),则未定义newProduct,因为$scope.$on未加载且无法检测到广播。有没有什么办法解决这一问题?非常感谢!

1 个答案:

答案 0 :(得分:1)

您应该将loadTargetProduct放入$on回调中,如果未加载新产品,请使用getTargetProduct加载它。

   $scope.$on('newProduct', function(newProduct){
      if (!(newProduct)){
          //if newProduct is not laoded, load it. 
          testService.getTargetProduct().then(function(targetProduct) {

             $scope.targetProduct = targetProduct; 
          })
       }
   })