【发布时间】:2013-01-14 05:09:54
【问题描述】:
我在 Angular 中创建了一个如下所示的控制器(为简洁而编辑):
function AppCtrl($scope, $http, $location, $dataService) {
$scope.projects = $dataService.data.projects;
}
从我的$dataService 服务中正确加载$scope.projects 承诺。
app.service('$dataService', function($q, $http, $location, $rootScope) {
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};
//UPDATE FUNCTION
function updateObjectInArray(array, object, newData) {
for(i in array) {
if(array[i] == object) {
if(newData != undefined) {
array[i] = newData;
} else {
return array[i];
}
}
}
return undefined;
}
this.updateProject = function(project, updateData) {
$http.put('/api/projects/' + project._id, updateData)
.success(function(data, status, headers, config) {
updateObjectInArray(dataService.data.projects.$$v, project, data);
}).error(function(data, status, headers, config) {});
};
});
我创建了另一个看起来像这样的控制器,它根据当前 URL 从项目数组中选择一个项目:
function ProjectCtrl($scope, $route) {
//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];
}
}
});
}
当我尝试运行我的updateObjectInArray() 函数时(在我的$http.put() 请求成功时),我在AppCtrl 中的$scope.projects 已正确更新(项目数组)但我在@987654331 中的$scope.project @ 已未更新。我可以在updateObjectInArray() 函数中记录array[i],它会准确记录我的期望,我可以在AppCtrl 中记录$scope.projects,它会相应更新,但是当我尝试在我的@ 中记录$scope.project 987654337@ 控制器,它没有相应地更新。
我认为原因是因为我在更新updateObjectInArray() 中的array[i] 对象后必须调用$rootScope.$apply() 或$rootScope.$digest(),但是,我得到$digest is already in progress 的错误。
我需要做些什么来确保数组中的$scope.project 项目在我的ProjectCtrl 中得到更新?我需要为它解决一个新的承诺吗?
【问题讨论】:
-
你在哪里调用updateProject?你确定是在解析 $dataService.data.projects 之前吗?尝试在几个函数中添加console.logs
-
不,我想在解析
$dataService.data.projects后调用它。预期的功能是它在页面首次加载时从服务器中提取数据,并且用户可以执行将更新发送到服务器的操作,如果成功,则使用从服务器返回的新数据更新范围。 -
我的意思是之后:) 还为时过早。
-
当用户单击按钮时,我在控制器中调用它。是的,我很肯定它已经解决了。正如我所说,我可以在更新对象后记录
array[i],并且它已经完全按照我的预期进行了更新,但是记录我的范围显示它还没有更新到$dataService.projects现在等于。 -
(我的意思是输入
$dataService.data.projects)
标签: angularjs