使用服务和控制器数据之间的引用时遇到问题
// 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
});
});
}
问题
答案 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;
对齐也会导致控制器指向与服务不同的数据实例。
整体问题是参考服务和控制器指向。