2013-01-14 97 views
1

單個項目我有兩個控制器:AngularJS承諾不更新範圍設置爲在陣列

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.projectsAppCtrl接收到更新,並且當新數據從服務器返回時,作用域會自動更新。然而,$scope.projectProjectCtrl從來沒有得到更新,它是與舊數據卡住了。我想這是因爲它只是數組中的單個對象?在updateProject()函數中設置了數據後,我嘗試調用$rootScope.$apply(),但它給了我一個$摘要已經在進行的錯誤。我需要做些什麼才能確保$scope.project(單個項目)得到更新?我需要爲此做出新的承諾嗎?有人可以展示它是如何完成的嗎?

+0

只是一個簡單的問題。 ProjectCtrl中的$ scope.projects屬性來自哪裏? –

+0

啊,對不起,我沒有指定。它和'AppCtrl'中的$ scope.projects是一樣的。 'ProjectCtrl'實際上是一個'ng-view',它嵌套在'AppCtrl'中。 –

回答

4

問題基本上就是你說的,$scope.project是對$scope.projects數組內對象的引用,所以它會保存它的引用直到Controller被銷燬。

嘗試看對$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); 
} 
+0

優秀。而已。萬分感謝。 –