如何在AngularJS中访问服务中的控制器变量
我有一个ProductService,它获取数据并提供给ProductsController。这是代码如何在AngularJS中访问服务中的控制器变量,angularjs,Angularjs,我有一个ProductService,它获取数据并提供给ProductsController。这是代码 sampleApp.factory('ProductService', ['$http', function ($http){ var req = { method: 'POST', url: 'ProductData.txt', //url: 'http://localhost/cgi-bin/superCategory.pl',
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
如何解决这个问题
如果有更好的体系结构来实现这一点,那也是受欢迎的。您需要在服务中重写
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
});
};
为什么不将产品阵列存储在服务中呢?我也可以这样做。但根据AngularJS的最佳实践和建议,它总是很好地将变量存储在控制器中。如果我错了请纠正我?不。控制器是存储特定于该视图的VM的好地方。如果数据需要在多个控制器/视图之间持久化和共享,则服务是存储数据的最佳位置@DeveshAgrawalDo不要访问服务中的控制器-这打破了MVC模式只需传递id即可。感谢您的响应。您能帮助我在控制器中现在需要做哪些更改,以便产品也可以在控制器中使用吗?在以上答案中更新