1

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

4

1 に答える 1

4

問題は基本的にあなたが言ったことです。これは配列$scope.project内のオブジェクトへの参照である$scope.projectsため、コントローラーが破棄されるまでその参照を保持します。

の変更を監視し、それが発生したときに$scope.projects(再) 割り当てを試みます。$scope.project

function ProjectCtrl($scope, $route, $q) {        
    $scope.$watch('projects', function(projects) {
       for (i in projects) {
            if(projects[i]._id == $route.current.params.projectId) {
                $scope.project = projects[i];
            }
        }
    }, true);
}
于 2013-01-15T00:42:11.540 に答える