Angular.js中服务和控制器数据之间的引用丢失

时间:2013-09-18 06:39:04

标签: angularjs angularjs-scope angularjs-service

使用服务和控制器数据之间的引用时遇到问题

// We have a service that we use to store id and some other data
app.service('testService', function ($http, serverURL) {
    var self = this;
    self.data = {
        id: null,
        token: null,
        ....
    };
    self.initMe = function () {
        return $http({
            method: 'GET',
            url: serverURL + '/initMe/' + '?token=' + self.data.token
        });
    };
    return self;
});
meModule.controller('MeCtrl', function (testService, ...) {
    $scope.me = testService.data; // we make a connection between the scope and the controller

    $rootScope.$on('initMe', function (e, data) {
        testService.initMe().success(function (data, status, headers, config) {
            // typeof(data.result) === 'object'
            // $scope.me = data.result;         // Doesn't work
            // OR
            // testService.data = data.result;    // Doesn't work

            testService.data = data.result; //  
            $scope.me = testService.data;   // It works, but we have to recover
                                            // the references between scope and service
        });
    });
}

问题

  1. 为什么我们在$ scope.me =中放宽了范围和服务之间的联系 data.result或meService.data = data.result;?
  2. 也许还有其他更好的方法来更新服务中的数据 来自外部API(获取请求)?

2 个答案:

答案 0 :(得分:3)

这就是JavaScript的工作原理。请考虑以下示例:

> first = { data: null }
{ data: null }
> second = { data: first.data }
{ data: null }
> first.data = "something"
'something'
> second.data
null

这一行有一个错误的断言:

$scope.me = testService.data; // we make a connection ...

范围与服务之间没有实际联系;你只是复制简单的价值。但是,如果存储对象的引用,则可以在适当位置更新该对象 ,并保留“连接”。考虑这个例子:

> first = { data: {} }
{ data: {} }
> second = { data: first.data }
{ data: {} }
> first.data['something'] = 'stuff'
'stuff'
> second.data
{ something: 'stuff' }

答案 1 :(得分:0)

服务就像一个构造函数。你没有返回构造函数。

我不确定你失去联系是什么意思。但是,您在服务上创建的对象data不应在服务中随时重新分配。您当前正在更新控制器中的数据。在服务中也可以这样做。

您突出显示的$scope.me = data.result;对齐也会导致控制器指向与服务不同的数据实例。

整体问题是参考服务和控制器指向。