控制器之间的角度传递数据

时间:2016-06-09 11:19:04

标签: javascript angularjs

我需要在控制器之间共享数据,所以我创建了工厂

假设我有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个调用将转到服务器。我不想要三个电话我只想打一个电话。

注意:所有三个控制器的值都相同

有什么方法可以实现这一点。

由于

3 个答案:

答案 0 :(得分:1)

答案 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;
    ....
}