在我的案例中如何设置 Angular http 调用

How do I set Angular http calls in my case

我正在尝试设置一个服务来设置 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 没有被加载并且不能检测广播。有没有什么办法解决这一问题?非常感谢!

您应该将 loadTargetProduct 放在 $on 回调中,如果您的 newProduct 未加载,请使用 getTargetProduct 加载它。

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

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