我已经在Angular中创建了一个控制器,代码如下(为了简洁起见进行了编辑):
当我尝试运行我的
我认为原因是在我更新
我需要做什么才能确保在我的
function AppCtrl($scope, $http, $location, $dataService) {
$scope.projects = $dataService.data.projects;
}
如何正确从我的 $dataService
服务中加载 $scope.projects
的 promise。
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
正确更新(项目数组),但是我的ProjectCtrl
中的$scope.project
没有更新。我可以在updateObjectInArray()
函数内记录array[i]
,并且它将记录我所期望的内容,我可以记录AppCtrl
中的$scope.projects
,它将相应地更新,但是当我尝试在ProjectCtrl
控制器中记录$scope.project
时,它没有相应地更新。我认为原因是在我更新
updateObjectInArray()
中的array[i]
对象后,我必须调用$rootScope.$apply()
或$rootScope.$digest()
,然而,我得到错误提示$digest is already in progress
。我需要做什么才能确保在我的
ProjectCtrl
中更新数组中的$scope.project
项目?我需要解决一个新的Promise吗?
$dataService.data.projects
之后调用它。预期的功能是在页面首次加载时从服务器获取数据,用户可以执行一个操作将更新发送到服务器,如果成功,则使用从服务器返回的新数据更新作用域。 - winduptoyarray[i]
,并且它已经按照我的期望进行了更新,但记录我的作用域显示它没有被更新为$dataService.projects
现在相等的值。 - winduptoy$dataService.data.projects
。 - winduptoy