2014-10-10 2 views
1

Краткое описание: - Создаем сайт социальной сети и сохраняем статусы и пользователей с помощью MongoDB. Таким образом, у вас есть такой статус, например,

{ 
    "status" : "Hello world.", 
    "profileURL" : "ac271a307", 
    "comments" : [ ], 
    "time" : "2013-10-28T22:25:24.278Z", 
    "active" : true, 
    "owner" : DBRef("users", "[email protected]"), // 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); 
}) 

Теперь, если вы делаете console.log() из «статуса» внутри WebSocket функции обратного вызова, я получаю статус и появляется дважды. В некотором смысле, что websocket был отправлен дважды (из которых я не контролирую). Поэтому, когда это помещается внутри «$ rootScope.statuses», когда я получаю ошибку «Ошибка: [ngRepeat: dupes] Дубликаты в ретрансляторе не разрешены. Используйте выражение« track by »для указания уникальных ключей». Это не имеет смысла, потому что я на самом деле, используя $ трек статуса [ '_ ид']

+0

Вы видели этот вопрос еще? http://stackoverflow.com/questions/14748440/angular-js-using-ng-options-to-only-display-unique-values ​​ В принципе вы можете скачать плагин, который будет выполнять всю работу по получению уникальных предметов в ваших данных .. – BuddhistBeast

+0

Спасибо @BuddhistBeast. Ваш комментарий привел меня к правильному пути. Кредит для вас. –

+0

Конечно! Я буквально зашел в тупик, когда я впервые попытался сделать то же самое ... Мне потребовалось несколько часов, чтобы наконец понять, что плагин будет решать все! – BuddhistBeast

ответ

2

@BuddistBeast комментарий (под мой вопрос) привести меня на правильный путь к решению моей проблемы. В итоге я добавил плагин https://github.com/a8m/angular-filter и использовал его «уникальный» фильтр. Это фиксировало ошибки обмана ошибок ngRepeat. Но потом я по-прежнему вижу дублированные статусы, появляющиеся по какой-либо причине (но без ошибок на консоли). Так что, если я опубликую «привет», например, я увижу «привет», появляющийся дважды. Мне удалось все это исправить, но исправление этой проблемы является отдельным и выходит за рамки этого вопроса.

1

Try:

<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"> 
+0

Я уже пробовал это, и когда я отправляю статус, я ** dont't ** получаю ошибку вообще, но происходят какие-то странные вещи. Теперь у меня есть дублированные статусы. Так, например, можно сказать, что я публикую статус «привет», он будет выглядеть как 5 раз (дублируется) в пользовательском интерфейсе ... Когда я использую предыдущий трек по статусу ['_ id'], я не получаю дублирует, но я получаю сообщение об ошибке. –

+0

На данный момент попробуйте удалить '| isUserStatus' и посмотреть, что произойдет - и убедитесь, что вы постоянно держите «дорожку по индексу», это способ ее использования. – developer10

+0

Я думаю, что этот '$ index' сам по себе не имеет никакого отношения к идентификатору вашего применения. 'track by $ index' используется только для того, чтобы ваши значения' ngRepeat' всегда были уникальными (потому что ключи массива будут уникальными - 0,1,2,3, ....) – developer10

0

Попробуйте отслеживать с помощью $id(status) может решить ваш вопрос

Смежные вопросы