私は2つのコントローラーを持っています:
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
inProjectCtrl
は更新を取得せず、古いデータでスタックします。これは、配列内の単一のオブジェクトしかないためだと思いますか?$rootScope.$apply()
関数にデータを設定した後で呼び出してみましupdateProject()
たが、$digestがすでに進行中であるというエラーが表示されます。それを確認するために私は何をする必要がありますか$scope.project
(単一のアイテム)が更新されますか?そのために新しい約束をする必要がありますか?誰かがそれがどのように行われるかの例を示すことができますか?