2014-12-04 2 views
4

Предположим, что список из 1000 элементов отображается с бесконечной прокруткой.Эффективный способ привязки один раз, но позволяющий обновить все элементы.

Каждый элемент отображает: имя первого лица, lastName и настроение. (чтобы сделать его простым)

Первоначально я не хотел слушать обновления.
Так что отличная директива angular-bindonce или даже лучше: угловая 1.3 односвязная функция сделала трюк.

Теперь я создал компонент pull-to-refresh, позволяющий обновить все элементы.
Однако, как привязка один раз (и не перезагрузка страницы), весь мой список не принимал обновления в учетной записи.

Используя угловой-bindonce, у меня есть это в настоящее время:

<div bindonce ng-repeat="person in persons track by person.id"> 
    <span bo-text="person.firstName"></span> 
    <span bo-text="person.lastName"></span> 
    <span bo-text="person.currentMood"></span> 
</div> 

Притяжение к обновлению вызывает эту функцию:

$scope.refresh() { 
    Persons.getList(function(response)) { 
     $scope.persons = response.data; //data being an array 
    } 
} 

вопрос:

Есть ли способ обновлять все данные ТОЛЬКО при срабатывании pull-to-refresh?
В этом случае я мог бы сохранить эту привязку, которая значительно повысила бы производительность при работе с огромными списками лиц.

До сих пор я вынужден ... использовать двустороннюю привязку, естественный способ угловых работ.

В более общем плане, как иметь дело с огромными списками с бесконечной прокруткой, которые необходимо обновлять только при срабатывании некоторых событий?

+0

http://blog.thoughtram.io/angularjs/2014/10/19/exploring- angular-1.3-ng-model-options.html интересно ... – Mik378

+1

вам нужно отслеживать person.id? если вы удаляете трек, нормальный привязку один раз. {::} синтаксис работает отлично – chrismarx

+1

Как и @chrismarx, рекомендуется изменить с дорожки на индекс $ index на мой собственный уникальный идентификатор, кажется, работает – Ladmerc

ответ

0

refresh-on директива может сделать трюк, нашел ссылку HERE:

<div bindonce="persons" refresh-on="'refresh'" ng-repeat="person in persons track by person.id"> 
    <span bo-text="person.firstName"></span> 
    <span bo-text="person.lastName"></span> 
    <span bo-text="person.currentMood"></span> 
</div> 
+0

'refresh-on' кажется не родным для директивы bindonce. – Mik378

+0

вам нужна последняя версия bindonce –

+0

Странно. Версия в ветке github: rebind-debug имеет директиву. Это 0.3.1. Мастер - 0.3.2 и не имеет его. Сейчас я использую мастер. – Mik378

0

Вместо того, чтобы пытаться обойти не используя двухстороннюю связывания, но до сих пор все ее преимущества есть, скорее всего, и простое решение. Вы говорите, что есть 1000 строк, все 1000 строк с видовым/видимым для пользователя одновременно?

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

Единственное важное условие буферизации заключается в том, что все строки должны быть одинаковой высоты, без строк переменной высоты.

Вот некоторые виртуальные директивы скроллинг/буферные посмотреть на:

https://github.com/EnzeyNet/VirtualScroll

https://github.com/stackfull/angular-virtual-scroll

https://github.com/kamilkp/angular-vs-repeat

+0

Мои строки не имеют одинаковой высоты. – Mik378

+0

Вы считали статическую высоту? Использование директив виртуальной прокрутки улучшит производительность вашего приложения с большим количеством данных и сделает привязку не относящейся к проблеме. – Enzey

+0

Некоторые предметы должны показывать гораздо больше информации, чем другие. Я тоже попробовал сборник-повтор ионных каркасов. – Mik378

2

Получить angular-bind-notifier.

Используйте родные привязки (с несколькими видоизмененного синтаксисом) и настройки ваша разметка, как так:

<div ng-repeat="person in persons track by person.id" bind-notifier="{ eventKey:watchedExpression }"> 
    <span>{{:eventKey:person.firstName}}</span> 
    <span>{{:eventKey:person.lastName}}</span> 
    <!-- or with ng-bind if you prefer that --> 
    <span ng-bind=":eventKey:person.currentMood"></span> 
</div> 

Теперь, когда значение watchedExpression изменений - это $broadcast будет пересылаться через childscope созданного bind-notifier и укажите каждую привязку с синтаксисом :key:expr для переоценки.


Если вам нужно, вы также можете отправить $broadcast вручную в следующем формате:

$scope.$broadcast('$$rebind::' + key) // where 'key' === 'eventKey' in the example above. 
Смежные вопросы