zoonman
@zoonman
⋆⋆⋆⋆⋆

Как правильно изменять модель в AngularJS?

Имеется следующий работающий говнокод (не могу назвать иначе, ибо пока только учусь).
'use strict';

angular.module('dumpsterApp.controllers', []).
    controller('AppCtrl', function ($scope, socket) {
      $scope.tl = 20;
      $scope.news = [];
      socket.on('news', function (data) {
        $scope.news.push(data); // засовываем данные
        if ($scope.news.length > $scope.tl) { 
          $scope.news = $scope.news.slice(-$scope.tl); // а теперь удаляем
        }
      });
    })

Собственно имеется у меня подозрение, что ангуляр обновляет DOM сразу после пуша в массив $scope.news, а потом еще раз после слайса.
Скажите, что я неправ, или, если прав, подскажите, как сделать правильно. Т.е. запушить и заслайсить, а потом сделать рефреш дома.
Суть штуки простая - очень быстро изменяющаяся таблица (несколько раз в секунду, где-то 5-20). Хочу добиться минимальной нагрузки на процессор. Я слышал есть какой-то способ отключения прослушки внешнего изменения модели (со стороны DOM), но пока не знаю, как это правильно делать.
  • Вопрос задан
  • 2354 просмотра
Решения вопроса 2
@Demetros
Вы неправы, dom обновляется один раз.
Если ваша таблица изменяется настолько часто, то предполагаю, что ваш вопрос происходит из-за того, что вы столкнулись с некими тормозами?
Ответ написан
DigitalSmile
@DigitalSmile
http://brainstorage.me/digitalsmile
Вообще я бы Вам посоветовал использовать limitTo (https://docs.angularjs.org/api/ng/filter/limitTo) и Queue для добавления элементов.
Что-то вроде (если я правильно понял задачу):
<div ng-repeat="item in news | limitTo:maxLength"> ... </div>

$scope.maxLength = 20;
      socket.on('news', function (data) {
        $scope.news.unshift(data); // засовываем данные
        
        if ($scope.news.length > $scope.maxLength) { // удаляем ненужное если значение превысило лимит
              $scope.news.slice($scope.maxLength, $scope.news.length - 1);
        }
      });

И по поводу Вашего вопроса - ангуляр вероятно не будет два раза перерисовывать дом дерево, он это наверянка сделает в следующем цикле $digest один раз.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы