我有两个控制器:
function AppCtrl($scope, $dataService) {
$scope.projects = $dataService.data.projects;
}
function ProjectCtrl($scope, $route, $q) {
//Getting the current project from the array of projects
$scope.project = $scope.projects.then(function(projects) {
for(i in projects) {
if(projects[i]._id == $route.current.params.projectId) {
return projects[i];
}
}
});
}
我提供的服务:
app.service('$dataService', function($q, $http, $location) {
var dataService = this; //Provides access 'this' inside functions below
var projectsDeferred = $q.defer();
$http.get('/api').success(function(data, status, headers, config) {
projectsDeferred.resolve(data.projects);
}).error(function(err) {
projectsDeferred.reject(err);
});
this.data = {projects: projectsDeferred.promise};
this.updateProject = function(project, updateData) {
$http.put('/api/projects/' + project._id, updateData).success(function(newData, status, headers, config) {
for(i in dataService.data.projects.$$v) {
if(project == dataService.data.projects.$$v[i]) {
dataService.data.projects.$$v[i] = newData;
}
}
}).error(function(data, status, headers, config) {});
};
});
当用户执行某个操作时,我将调用$dataService.updateProject()
将数据发送到服务器,如果成功,服务器将响应更新的数据,然后在数组中设置匹配的项目到了新的价值。我可以确认$scope.projects
中的AppCtrl
收到更新,并且当从服务器返回新数据时,范围会自动更新。但是,$scope.project
中的ProjectCtrl
永远不会获得更新,而且它会被旧数据所困扰。我想这是因为它只是数组中的一个对象?我在$rootScope.$apply()
函数中设置数据后尝试调用updateProject()
,但它给出了$ digest正在进行中的错误。我需要做些什么来确保$scope.project
(单个项目)得到更新?我是否需要为此做出新承诺?有人能举例说明它是如何完成的吗?
答案 0 :(得分:4)
问题基本上就是你所说的,$scope.project
是$scope.projects
数组中对象的引用,因此它将保留其引用,直到Controller被销毁。
尝试观看$scope.projects
上的更改,并在发生时重新分配$scope.project
:
function ProjectCtrl($scope, $route, $q) {
$scope.$watch('projects', function(projects) {
for (i in projects) {
if(projects[i]._id == $route.current.params.projectId) {
$scope.project = projects[i];
}
}
}, true);
}