повторный рендеринг ‘ng-repeat’ создает мерцание

#angularjs

#angularjs

Вопрос:

Я использую ng-repeat для перечисления всех «зон». Он отлично работает при первом рендеринге, и даже когда к существующим данным добавляются дополнительные данные с сервера, он работает без каких-либо проблем или мерцаний. Но когда «$ rootScope.zones» присваивается новое значение (пользователь может изменить порядок сортировки с алфавитного на близкий, что устанавливает новое значение для $rootScope.zones в этом порядке сортировки), весь список ng-repeat на несколько секунд становится пустым, а затем снова работает нормально. Это не очень большая проблема, за исключением зон, в которых у меня есть текст с пузырьками CSS. Текст исчезает, но пузырьки остаются.

Как я могу установить $rootScope.zones таким образом, чтобы он не создавал этого мерцания? В качестве альтернативы, как я могу убедиться, что «пузырьки» появляются только при наличии текста.

Это мой ng-repeat:

 <ion-list class="card" ng-if="$root.currentMode.zoneBroadcast == true" can-swipe="true">
      <div class="button-bar no-padding">
        <button class="button bold" ng-class="{'button-calm': sortMethod === 'Alphabetically'}" ng-click="changeSortMethod('Alphabetically')">Alphabetically</button>
        <button class="button bold" ng-class="{'button-calm': sortMethod === 'By Proximity'}" ng-click="changeSortMethod('By Proximity')">By Proximity</button>
      </div>
      <ion-item class="item no-border no-padding dark-bg" ng-repeat="zone in $root.zones track by zone.zoneName"
                ng-if="checkVisibility(zone.zoneName)">
          <div class="item-divider text-center">
              <span>
                Zone ID : <span>{{zone.zoneName}}</span>
              </span>
          </div>
          <div class="item-body" ng-class="checkIfZoneMatches(zone.zoneName) ? 'zone-broadcast-green' : parseStringToInteger(zone.Trips.length) > 0 ? 'zone-broadcast-red' : checkIfZoneCanBookIn(zone.zoneName)  ? 'zone-broadcast-yellow' : zone.Lineup.FreeList.length > 0 ? 'zone-broadcast-blue' : 'zone-broadcast-normal'">
            <div class="row">
              <div class="col">
                <span ng-class="{'lineup free' : zone.Lineup.FreeList.length != 0}">{{zone.Lineup.FreeList.toString()}}</span>
                <span ng-class="{'lineup loaded' : zone.Lineup.LoadedList.length != 0}">{{zone.Lineup.LoadedList.toString()}}</span>
                <span ng-class="{'lineup accepted' : zone.Lineup.AcceptedList.length != 0}">{{zone.Lineup.AcceptedList.toString()}}</span>
                <span ng-class="{'lineup offered' : zone.Lineup.OfferedList.length != 0}">{{zone.Lineup.OfferedList.toString()}}</span>
                <span ng-class="{'lineup break' : zone.Lineup.BreakList.length != 0}">{{zone.Lineup.BreakList.toString()}}</span>
                <span ng-class="{'lineup stc' : zone.Lineup.STCList.length != 0}">{{zone.Lineup.STCList.toString()}}</span>
              </div>
            </div> ... 
  

Я пробовал ng-if, ng-hide, track by и т.д. Но, похоже, ничего не работает.
Вот CSS, который я использую для создания пузырьков.

 .lineup{
  background: white;
  border-radius: 2em;
  font-weight: bold;
  font-size: 100%;
  padding: 1%;
}
.free {
  color: #00b140;
}
.loaded{
  color: #6b46e5;
}
.accepted{
  color: #0a9dc7;
}

.offered{
  color: deeppink;
}

.break{
  color: orangered;
}

.STC{
  color: saddlebrown;
}
  

Я ожидаю, что пузырьки будут появляться только тогда, когда текст есть. Более того, когда порядок сортировки изменяется пользователем, он не должен оставаться пустым более 2 секунд, а затем отображать шаблон.
Я был бы действительно признателен за вашу помощь.

Ответ №1:

Вместо использования ng-if с ng-repeat , переход к фильтру:

МЕДЛЕННО

 <ion-item class="item no-border no-padding dark-bg"
          ng-repeat="zone in $root.zones track by zone.zoneName"
          ng-if="checkVisibility(zone.zoneName)">
  

Быстрее

 <ion-item class="item no-border no-padding dark-bg"
          ng-repeat="zone in zones | filter : zoneFilter track by zone.zoneName">
  
 $scope.zoneFilter = function(item) {
     return $scope.checkVisibility(item);
};
  

Для получения дополнительной информации см.

Ответ №2:

Изменение zone.Lineup.FreeList.length != 0 на zone.Lineup.FreeList.length > 0 решило проблему пузырьков.