我需要在控制器之间共享数据,所以我创建了工厂
假设我有url:abc / 123(注意:123是动态的,我需要从控制器传递它)
mycode的
appServices.factory('classesService', function($http){
return {
getClasses: function(value) {
return $http.get(urlprefix + 'orgs/' + value + '/classes?with-users=true');
}
};
});
在控制器
中classesService.getClasses($scope.organization.id).then(function(data){});
现在假设我在3个控制器中使用它3个调用将转到服务器。我不想要三个电话我只想打一个电话。
注意:所有三个控制器的值都相同
有什么方法可以实现这一点。
由于
答案 0 :(得分:1)
您可以使用UI-ROUTER-EXTRAS“https://christopherthielen.github.io/ui-router-extras/#/home”
答案 1 :(得分:0)
最简单的解决方案是在您的服务中启用缓存。这样,所有控制器都可以访问该方法,并且只发出一次请求。
return $http.get(urlprefix + 'orgs/' + value + '/classes?with-users=true', {cache: true});
这是非常基本的缓存。您可能需要更高级的策略 - 但这是您的第一步。
<强>更新强>
如果在第一个请求完成之前发出第二个或第三个请求,则可能会遇到简单$ http缓存的竞争条件。我们可以轻松克服这个问题
appServices.factory('classesService', function($http) {
var orgsPromise;
return {
getClasses: function(value) {
if (orgsPromise) return orgsPromise;
orgsPromise = $http.get(urlprefix + 'orgs/' + value + '/classes?with-users=true');
return orgsPromise;
}
};
});
答案 2 :(得分:0)
我相信你可以做这样的事情;
var yourApp = angular.module('yourApp',[]);
yourApp.factory('classesService', function($http){
var classes;
return {
getClasses: function(value) {
if (!classes) {
classes= $http.get(urlprefix + 'orgs/' + value + '/classes?with-users=true');
}
return classes;
}
};
});
yourApp.factory('Classes', ['classesService',function(classesService){
return classesService.getClasses();
}]);
function yourControllerA($scope, Classes) {
$scope.value="Hello from Controller A";
$scope.sharedValue=Classes;
....
}
function yourControllerB($scope, Classes) {
$scope.value="Hello from Controller B";
$scope.sharedValue=Classes;
....
}
function yourControllerC($scope, Classes) {
$scope.value="Hello from Controller C";
$scope.sharedValue=Classes;
....
}