2016-10-08 3 views
4

Попытка сделать бесконечную страницу прокрутки, которая отображает элементы как пользовательские свитки.Angular2 Meteor, выдающий бесконечный прокрутки (прокрутка к началу)

Таким образом, каждый раз, когда я обнаружить, что свиток достигает конца страницы, которую я называю

this.recordLimit += 10; 
this.subscribe('movements', {limit: this.recordLimit}); 

и что triggeres (автозапуск)

 this.autorun(h => { 
      if (this.ready()) { 
       this.items = Items.find(<potential limit filter here too>); 
      } 

Все правильно. Это работает. Однако каждый раз, когда вызывается this.items = Items.find();, браузер пользователя прокручивается вверх.

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

Что я делаю неправильно?

Примеры, где это 'apparenty' работает:

@ ########### Редактировать ## ########## @

На самом деле, я заметил, что после Items.find() a h.stop(), чтобы остановить подписку, это работает ... Думаю, предыдущий манго-курсор обновлен с последним лимитом подписки.

Однако я до сих пор не могу понять, почему это было перекрашивать все в первоначальном случае ..

ответ

1

Я считаю, что проблема в том, что вы найти документы снова, как вы уже догадались. Вы должны подписаться только на свою публикацию в автозапуске. Проверьте this от Angular2 & Учебник по метеорологии, который объясняет, что паб/под довольно хорошо.

В автозагрузке он перезапустит find() и повторно отобразит все документы, поэтому вам необходимо повторно запустить подписку на автозапуск для вашего дела. Из-за того, как работают pub/sub и наблюдатели, поскольку единственное, что вы меняете, это «ограничение» в вашей функции, а остальное - то же самое, публикация будет возвращать только новые документы и сохранять ранее возвращенные. Запрос find() на стороне клиента будет извлекать документы, возвращенные из pub/sub, и при изменении количества документов он не будет повторно получать уже извлеченные документы.

+0

Я не понимаю, что «вы должны подписываться только на свою публикацию», точнее «нужно» и «только». Как подписывается внутри автозапуска либо хорошей практикой, либо требуется? – ATX

+0

@ATX его из-за того, как работают наблюдатели. скажем, вы возвращаете 20 документов, а затем прокручиваете, вы изменяете лимит до 40, он не будет повторно отображать ранее извлеченные 20 документов, если вы подписаны в своем автозапуске и вернете документы НЕ в автозапуск. У меня такая же функциональность для кликов кнопок или прокрутки inifinite. – Luna

+0

@ATX, чтобы быть более понятным, подписка возвращает документы на стороне клиента, а не в определенное место в вашем приложении, но делает их доступными на стороне клиента. Таким образом, вы авторизуете подписку, так как вы изменяете лимит.Затем публикация получает запрос, и поскольку единственным изменением является предел, он возвращает еще 20 документов. Поскольку у вас уже есть документы xx перед изменением лимита, и вы не возвращаете их внутри автозапуска, он функционирует так, как должен, и почему это «правильная» практика. – Luna