我有这个函数,它返回带有json
$scope.product_owners = data
$http({
url: "php/functions.php",
method: "GET",
params: {
action: "get_product_owners"
}
}).success(function(data) {
$scope.product_owners = data;
});
目前,我正在所有控制器中调用此函数,因为它已在其中使用,但我想知道是否可以调用一次。例如,使用$rootScope
或类似的东西。
答案 0 :(得分:3)
跨控制器共享数据的“Angular方式”是使用 service :
app.factory('ProductOwners', function ($http) {
var service = {
data: []
};
$http({
url: "php/functions.php",
method: "GET",
params: {
action: "get_product_owners"
}
}).success(function(data) {
service.data = data;
});
return service;
});
然后在每个控制器中注入服务:
app.controller('someCtrl', function (ProductOwners) {
$scope.product_owners = ProductOwners.data;
});
具有“延迟”评估的不同实现(即,只有在需要时才进行调用,然后提供相同的数据):
app.factory('ProductOwners', function ($http, $q) {
var data;
function getDataIfNeeded() {
if (data !== undefined) {
return $q.when(data);
}
return $http({
url: "php/functions.php",
method: "GET",
params: {
action: "get_product_owners"
}
}).then(function(response) {
data = response.data;
return data;
});
}
return {
getData: getDataIfNeeded
};
});
app.controller('someCtrl', function (ProductOwners) {
ProductOwners.getData().then(function (data) {
$scope.product_owners = data;
});
});
<强>更新强>
又一个不同的实现,包含“懒惰”评估并支持将参数传递给getData()
:
app.factory('GenericService', function ($http, $q) {
var data = {};
function getDataIfNeeded(action) {
action = action || 'default';
if (data[action] !== undefined) {
return $q.when(data[action]);
}
return $http({
url: "php/functions.php",
method: "GET",
params: {
action: action
}
}).then(function(response) {
data[action] = response.data;
return data[action];
});
}
return {
getData: getDataIfNeeded
};
});
app.controller('someCtrl', function (GenericService) {
GenericService.getData("get_product_owners").then(function (data) {
$scope.product_owners = data;
});
});
答案 1 :(得分:2)
如果应用程序中的多个控制器使用相同的代码,您可能希望将其放入服务中,然后可以从控制器中调用它:
myApp.service('products', function($http) {
this.getProductOwners = function(targetScope) {
$http({
url: "php/functions.php",
method: "GET",
params: {
action: "get_product_owners"
}
}).success(function(data) {
targetScope.product_owners = data;
});
};
});
然后,在你的控制器中:
myApp.controller('MyCtrl', function($scope, products) {
products.getProductOwners($scope);
});
使用服务是多个控制器之间代码重用的首选方式。
答案 2 :(得分:2)
1-您可以建立工厂,然后在控制器内部需要时调用它
yourApp.factory('httpFactory', function($http) {
return {
$http({
url: "php/functions.php",
method: "GET",
params: {
action: "get_product_owners"
}
}).success(function(data) {
this.product_owners = data;
});
}}
然后基本上你把它注入到哪里,
yourApp.controller('xCtrl', function (httpFactory) {
$scope.product_owners = httpFactory.product_owners;
});
2-您也可以为此应用程序设置一个主控制器
<body ng-controller="mainCtrl">
然后将您的代码放入
yourApp.controller('mainCtrl', function($scope, $http) {
$http({
url: "php/functions.php",
method: "GET",
params: {
action: "get_product_owners"
}
}).success(function(data) {
$scope.product_owners = data;
}); }
现在您可以从任何schild范围访问此数据
答案 3 :(得分:0)
您绝对可以将其放在$rootScope
上以保存多个电话。
问题是 - 如果您将一个呼叫放在一个控制器上,是否可以转到另一个视图/控制器,从而跳过呼叫?
如果答案是肯定的,那么你没有问题。
如果答案是肯定的,那么你应该让一个控制器包装所有其他的控制器,以确保你有这些数据。
另一种可能是使用服务来保留product_owners
数据,并且每个控制器都可以访问该服务器以获取数据,如果它不可用,请获取它通过ajax
请求。