0

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

// 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(获取请求)更新服务中的数据?
4

2 回答 2

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 ...

范围和服务之间没有实际的联系;您只是在复制简单的值。但是,如果您存储对 object 的引用,则可以就地更新该对象,并且将保留“连接”。考虑这个例子:

> first = { data: {} }
{ data: {} }
> second = { data: first.data }
{ data: {} }
> first.data['something'] = 'stuff'
'stuff'
> second.data
{ something: 'stuff' }
于 2013-09-18T06:54:54.623 回答
0

服务就像一个构造函数。您不会在构造函数上返回。

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

此外,您突出显示的分配$scope.me = data.result;将导致控制器指向与服务所具有的不同的数据实例。

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

于 2013-09-18T06:55:08.963 回答