gpt4 book ai didi

AngularJS - 如何强制更新范围(数组项的 promise )

转载 作者:行者123 更新时间:2023-12-04 10:01:08 26 4
gpt4 key购买 nike

我在 Angular 中创建了一个如下所示的 Controller (为简洁起见进行了编辑):

function AppCtrl($scope, $http, $location, $dataService) {
$scope.projects = $dataService.data.projects;
}

正确加载 $scope.projects我的 promise $dataService服务。

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) {});
};

});

我创建了另一个看起来像这样的 Controller ,它根据当前 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() 请求成功时),我的 $scope.projectsAppCtrl已正确更新(项目数组),但我的 $scope.projectProjectCtrl不是 更新。我可以登录 array[i]里面 updateObjectInArray()功能,它将准确记录我的期望,我可以记录 $scope.projectsAppCtrl它会相应更新,但是当我尝试记录 $scope.project在我的 ProjectCtrl Controller ,它 不是 相应更新。

我以为原因是因为我不得不调用 $rootScope.$apply()$rootScope.$digest()在我更新 array[i] 之后 updateObjectInArray() 中的对象,但是,我得到了 $digest is already in progress 的错误。 .

我需要做什么来确保我的 $scope.project数组中的项目在我的 ProjectCtrl 中更新?我需要为它解决一个新的 promise 吗?

最佳答案

尽快projects已加载,您正在使用数组 projects[i] 中的一项,理论上假设它是对象 0x1在内存中。问题是,当加载新项目时(假设 0x2 ),并且您更新数组,您正在更改驻留在数组位置的对象( 0x1 ),但是 $scope.project仍然引用现在废弃的对象 0x1 .不能只在数组里改,要修改,所以不需要重新绑定(bind)$scope.project多变的。

最好的解决方案是更改 array[i] = newData angular.extend(array[i], newData) .这样,您只需更改数组 [i] 的所有属性,并作为您的 $scope.project指向内存中相同的对象,它将被更新。

反正我也相信你可能想更改 if(array[i] == object) { if(array[i]._id === object._id) {以及您的相等比较( == )到严格相等比较( === )。这个if更适合您的事业,因为新创建的对象与旧对象不同。

关于AngularJS - 如何强制更新范围(数组项的 promise ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14313573/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com