简体   繁体   中英

How do I set Angular http calls in my case

I am trying to setup a service to set the http request data. I need to set the data in one controller and obtain the data in the another controller when that page is loaded I have something like

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
        };
    }
]);

nav controller

  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)
   }

product detail controller

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

However, if product details controller hasn't been loaded (user is in different page) when user clicks setTargetProduct , The newProduct is undefined because the $scope.$on is not loaded and can't detect the broadcast. Is there anyway to fix this? Thanks so much!

You should put your loadTargetProduct inside your $on callback and if your newProduct is not loaded, use getTargetProduct to load it.

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM