在ng-repeat中更新嵌套对象

时间:2013-10-22 14:59:18

标签: javascript angularjs

我有一系列“活动”存储为$scope.activities。我在ng-repeat中迭代这些,一路上访问嵌套值和对象。

这些嵌套对象中的一些具有与它们相关联的动作,例如“喜欢”和“rsvp'ing”,然后调用我的后端并且应该更新ng-repeat中的值。这个逻辑看起来像这样:

$scope.rsvpToEvent = function(eventId) {
            eventService.rsvp(eventId, $rootScope.user._id).then(function (data) {
                for (var i = 0; i < $scope.activities.length; i++) {
                    if($scope.activities[i].event) {
                        if($scope.activities[i].event._id == data._id) {
                            $scope.activities[i].event = data;
                            break;
                        }
                    }
                }
            },
            function (errorMessage) {
            });
        };

我也尝试将$index传递给函数并直接访问该活动,而不是使用for循环。

如果我在console.log中,它会成功执行并更新值,但它不会更新dom或ng-repeat的值。我在另一个页面上使用类似的逻辑并且工作正常,所以我假设这是因为我正在尝试更新这样的嵌套对象(另一个页面的逻辑不在嵌套对象上)。 / p>

其他类似的问题表明,范围没有得到更新是一个问题。但是,如果我将其包装在$scope.$apply()中或之后调用它,我会得到“摘要已在进行中”错误。如果我尝试通过检查阶段来执行“安全”范围应用,则根本不会调用它,因为摘要已在进行中。还有另一种方法可以确保dom / ng-repeat更新吗?

1 个答案:

答案 0 :(得分:2)

如果更容易,你可以将整个活动传递给函数。

<div ng-repeat="activity in activities" ng-click="rsvpToEvent(activity)"> 

然后你不需要循环或类似的东西。

$scope.rsvpToEvent = function(activity) {
        eventService.rsvp(activity.event._id, $rootScope.user._id).then(function (data) {
           activity.event = data;
        },
        function (errorMessage) {
        });
    };