次のようなコントローラーをAngularで作成しました(簡潔にするために編集):
function AppCtrl($scope, $http, $location, $dataService) {
$scope.projects = $dataService.data.projects;
}
$scope.projects
私のサービスからプロミスを正しくロードし$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) {});
};
});
現在の URL に基づいてプロジェクトの配列から 1 つのプロジェクトを選択する、次のような別のコントローラーを作成しました。
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.projects
inAppCtrl
は正しく更新されますが (プロジェクトの配列)、$scope.project
inProjectCtrl
は更新されません。array[i]
関数内にログインupdateObjectInArray()
すると、期待どおりにログが記録され、ログイン$scope.projects
するとそれに応じて更新されますが、コントローラーAppCtrl
にログインしようとすると、それに応じて更新されません。$scope.project
ProjectCtrl
その理由は、を呼び出さなければならなかった$rootScope.$apply()
か、 でオブジェクト$rootScope.$digest()
を更新した後であると思ったのですが、.array[i]
updateObjectInArray()
$digest is already in progress
$scope.project
配列内のアイテムが で更新されるようにするにはどうすればよいProjectCtrl
ですか? そのための新しい約束を解決する必要がありますか?