【问题标题】:AngularJS promise doesn't update scope set to single item in arrayAngularJS 承诺不会更新范围设置为数组中的单个项目
【发布时间】:2012-12-28 22:01:22
【问题描述】:

我有两个控制器:

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(),它将数据发送到服务器,如果成功,服务器将响应更新的数据,然后将数组中的匹配项目设置为新的价值。我可以确认AppCtrl 中的$scope.projects 收到了更新,并且当新数据从服务器返回时,范围会自动更新。但是,ProjectCtrl 中的 $scope.project 永远不会获得更新,并且它被旧数据卡住了。我猜这是因为它只是数组中的一个对象?在updateProject() 函数中设置数据后,我尝试调用$rootScope.$apply(),但它给了我$digest 已经在进行中的错误。我需要做什么来确保$scope.project(单个项目)得到更新?我需要为此做出新的承诺吗?有人可以举例说明它是如何完成的吗?

【问题讨论】:

  • 只是一个简单的问题。 ProjectCtrl 中的 $scope.projects 属性从何而来?
  • 啊,抱歉我没有具体说明。它与$scope.projects 中的AppCtrl 相同。 ProjectCtrl 实际上是为 ng-view 供电,它嵌套在 AppCtrl 中。

标签: arrays angularjs promise


【解决方案1】:

问题基本上就是你所说的,$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);
}

【讨论】:

  • 优秀。而已。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2014-06-24
  • 2017-04-23
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多