使用服务AngularJS在两个控制器之间共享动态数据

时间:2013-05-22 23:54:30

标签: javascript rest angularjs controller

我有两个角度服务需要共享模型(消息列表和单个消息),这些服务来自对API的调用。服务如下:

angular.module('CmServices', ['ngResource'])
.factory('Messages', function ($resource, $routeParams, $rootScope) { 

    var data = {};

    data.rest = $resource(url, {}, {
            query: {method:'GET', params: params},
            post: {method:'POST', params: params}
        });

    // Trying to set this through a call to the API (needs to get param from route)
    $rootScope.$on('$routeChangeSuccess', function(event, current, previous) {
            var messages = data.rest.query({m_gid: $routeParams.gid}, function () { 
                data.messages = messages;
            });
    });

    return data;    
});

和控制器是:

function MessagesCtrl ($scope, $http, $location, $routeParams, Messages) {
   $scope.messages = Messages.messages;
}

function MessageCtrl ($scope, $http, $location, $routeParams, Messages) {
   $scope.messages = Messages.messages[0];
}

但是当数据从REST API加载时,两个控制器都没有更新(我已经记录了数据返回,但肯定会这样做)。

2 个答案:

答案 0 :(得分:8)

而不是将新数组分配给data.messages,如下所示:

data.messages = messages

使用angular.copy()代替,它将填充相同的数组:

angular.copy(messages, data.messages)

这样,控制器就会看到更新。

答案 1 :(得分:0)

问题是您要向每个控制器返回不同版本的data。我会将messages放在$ rootScope中。所以

data.rest.query({m_gid: $routeParams.gid}, function () { 
            $rootScope.messages = messages;
        });

顺便说一下,将data.rest.query的返回值设置为var messages的目的是什么?离开函数后,该变量就会被破坏。