2015-04-03 4 views
1

У меня есть ProductService, который извлекает данные и передает ProductsController. Это код.Как получить доступ к переменной контроллера в сервисе в AngularJS

sampleApp.factory('ProductService', ['$http', function ($http){ 
    var req = { 
     method: 'POST', 
     url: 'ProductData.txt', 
     //url: 'http://localhost/cgi-bin/superCategory.pl', 
     headers: { 'Content-Type': 'application/x-www-form-urlencoded' }//, 
     //data: { action: 'GET' } 
    }; 

    return { 
     GetProducts: function() { 
      return $http(req); 
     }, 
     GetDetailInfo: function (ProductID) { 
      // HOW TO IMPLEMENT THIS 
     } 
    }; 
}]); 



sampleApp.controller('ProductsController', function ($scope, $routeParams, ProductService, ShoppingCartService) { 

    $scope.Products = []; 

    $scope.GetProducts = function() { 
     ProductService.GetProducts().then(
      function(response) { 
       if (response.data !== undefined) { 
        //alert (response.data); 
        console.log(response.data); 
        $scope.Products = response.data; 
       } 
       else { 
        alert ('undefined data'); 
       } 
      }, 
      function(Error) { 
       alert ('error worng'); 
      } 
     ); 
    }; 

    $scope.GetProducts(); 
}); 

Теперь я хочу реализовать еще одну функцию в сервисе, которая дает подробную информацию о продукте. Но так как $ scope.Products недоступен в ProductService, я не могу закодировать и получить данные для желаемого ProductID.

Я хочу реализовать эту функцию в ProductService только в ProductsController, так как другая служба (которая требует данных о продукте) будет использовать этот ProductService.

Как решить эту проблему?

Если есть какая-либо лучшая архитектура для достижения того же, это также приветствуется.

+0

Почему не хранить массив продуктов в службе вместо этого? – Michael

+0

Я тоже могу это сделать. Но в соответствии с лучшей практикой AngularJS и SO предлагает свои всегда хорошие переменные хранилища в контроллере. Поправьте меня, если я ошибаюсь? –

+0

№ Контроллер - хорошее место для хранения виртуальных машин, специфичных для этого вида. Если данные должны сохраняться и совместно использоваться несколькими диспетчерами/представлениями, то служба является наилучшим местом для хранения данных. @DeveshAgrawal. – mohamedrias

ответ

1

Вам необходимо переписать GetProducts в свою службу для хранения данных о продуктах внутри службы.

Вместо того, чтобы возвращать $http(req), разрешите обещание внутри службы.

В обратном вызове успеха сохраняйте данные ответа в службе, объявив переменную внутри службы. Затем верните обещание контроллеру.

Это должно решить вашу проблему.

Пример кода:

sampleApp.factory('ProductService', ['$http', '$q', function ($http, $q){ 
    var req = { 
     method: 'POST', 
     url: 'ProductData.txt', 
     //url: 'http://localhost/cgi-bin/superCategory.pl', 
     headers: { 'Content-Type': 'application/x-www-form-urlencoded' }//, 
     //data: { action: 'GET' } 
    }; 
    var productService = {}; 
    productService.products = []; 
    return { 
     GetProducts: function() { 
      var defer = $q.defer(); 
      $http(req).then(function(response) { 
       productService.products = response.data; 
       defer.resolve(productService.products); 
      }, function(error) { 
       defer.reject("Some error"); 
      }); 
      return defer.promise; 
     }, 
     GetDetailInfo: function (ProductID) { 
      // HOW TO IMPLEMENT THIS 
      // productService.products is available here. Loop through and find. 
     } 
    }; 
}]); 

В контроллере:

$scope.GetProducts = function() { 
     ProductService.GetProducts().then(
      function(response) { 
        $scope.Products = response; 
      }, function(error) { 
      // your error code here 
      }); 
    }; 
+0

Спасибо за ответ. Можете ли вы помочь мне в каких изменениях, которые мне нужно внести в контроллер сейчас, поэтому Продукты также доступны в контроллере? –

+0

Обновлено выше в ответе – mohamedrias

Смежные вопросы