ngRepeat:dupes甚至跟踪$ index(特例)

时间:2014-10-10 16:06:08

标签: javascript angularjs websocket

简要背景: - 我正在构建一个社交网站,并将状态和用户存储在MongoDB中。所以你有这样的状态,例如

{
    "status" : "Hello world.",
    "profileURL" : "ac271a307",
    "comments" : [ ],
    "time" : "2013-10-28T22:25:24.278Z",
    "active" : true,
    "owner" : DBRef("users", "abc@efg.com"), // MongoDB Reference to the users Collection
    "_id" : ObjectId("526ee454da46f33bf8000002")
} 

现在正在进行角色扮演;

<li ng-repeat="status in statuses | isUserStatus track by status['_id']" ng-show="status.active" class="user-status-bland">

    // In here i display the users data and the status itself.
</li>

注意:所有这一切都很完美

但这是问题所在。我正在使用Websockets自动更新并将新状态添加到$ rootScope.statuses。

socket.on('new status', function(status) {
    $timeout(function() {
        $rootScope.$apply(function() {
            // stack the new status at the top of all statuses.
            $rootScope.statuses.unshift(status);
        });
    }, 0);
})

现在,如果你在websocket回调中执行'status'的console.log(),我会得到状态并且它会出现两次。从某种意义上说,websocket被发送两次(其中我无法控制)。因此,当这被放入“$ rootScope.statuses”时,当我收到错误时“错误:[ngRepeat:dupes]不允许在转发器中使用重复项。使用'track by'表达式指定唯一键。”< / b>它没有意义,因为我实际上是通过状态['_ id']

使用$ track

3 个答案:

答案 0 :(得分:2)

@BuddistBeast评论(在我的问题下面)引导我找到解决问题的正确途径。我最终添加了https://github.com/a8m/angular-filter插件,并使用了&#34; unique&#34;其中提供过滤器。这修复了出现的ngRepeat dupes错误。但是,我仍然会看到出于某种原因出现重复状态(但控制台上没有错误)。所以,如果我发布&#34; hi&#34;例如,我会看到&#34; hi&#34;出现两次。我确实设法完全解决了这个问题,但解决这个问题的方法是独立的,超出了这个问题的范围。

答案 1 :(得分:1)

尝试:

<li ng-repeat="status in statuses track by $index | isUserStatus " ng-show="status.active" class="user-status-bland">

或:

<li ng-repeat="status in statuses | isUserStatus track by $index" ng-show="status.active" class="user-status-bland">

答案 2 :(得分:0)

尝试按$id(status)跟踪它可能会解决您的问题