2016-08-17 7 views
0

Как мы можем повторно создать шаблон при переключении маршрутов?Повторно создать шаблон при маршрутизации маршрутов

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

Пример: amazing_page.html

{{#each}} 
    {{amazing_topic}} 
{{/each}} 

{{>subscriber name='topics' count=5}} 

subscriber.js

// грубый пример кода

Template.subscriber.onCreated(function() { 
    var self = this; 
    var type = Template.currentData().name; 
    var count = Template.currentData().count; 
    var user = Template.currentData().user; 
    var skipCount = 0; 
    self.autorun(function(c){ 
    self.subscribe(type, skipCount, user); 
    var block = true; 
    $(window).scroll(function() { 
     if (($(window).scrollTop() + $(window).height()) >= ($(document).height()) && block) { 
       block = false; 
       skipCount = skipCount + count; 
       console.log(type); 
       console.log(skipCount); 
       self.subscribe(type, skipCount, user, { 
        onReady: function() { 
         block = true; 
        }, 
        onStop: function() { 
         console.log('stopped'); 
        } 
       }); 
     } 
    }); 
    }) 
    }); 

Я использую этот шаблон с различными параметрами d ifferent маршруты. Проблема заключается в том, что пользователь переключает некоторые маршруты и прокручивается на одной странице, все подписчики, которых он получает на других страницах, будут действовать на этой странице. Более того, они будут хранить увеличенные значения для них переменных и будут делать всю включенную логику.

Я нашел плохое решение, когда мы используем Route.getName (например), сравнивая и указываем параметр абонента. Это не лучший вариант. Может кто-то помочь мне найти хорошую практику для этого :)

Простой пример:

У нас есть 3 различных маршрутов:

1) Новости 2) Видео 3) Темы

Эти шаблоны маршрутов включают специальные подписные шаблоны. И подписка работает отлично на свитке.

Хорошо, теперь давайте посмотрим на всех из них: Новости, Видео, Темы. Хорошо, теперь прокрутите вниз и ... У меня есть три экземпляра шаблона подписчика, который будет подписываться на их собственные публикации, потому что они не уничтожаются при переключении маршрутов.

И, как результат - когда пользователь прокрутки страницы темы, он зайдет на новости Подписка на и видео тоже, и он будет принимать данные из этих коллекций тоже;) А - это проблема :)

UPD: Похоже, мы находим решение. Если я использую Template.instance (autorun/subscribe), он начнет работать, если не считать некоторых странных случаев :)

Прежде всего, когда я иду по другому маршруту на следующей итерации (прокрутка вниз), он возвращает мне данные из старого , уничтоженный шаблон + ошибка. В следующий раз (следующая итерация) он начнет подписываться на правильные данные. Хм ... похоже, я ошибаюсь в разделе автозапуска ... или нет?

Прикрепленная печать экрана с консоли this

+0

Было трудно понять, в чем проблема, но это звучит так, как будто ваши подписки не работают. – CodeChimp

+0

Хорошо, снова. Например, мы имеем 3 различных маршрутов: 1) Новости 2) Видео 3) Темы Эти маршруты включены специальные абонентские-шаблоны. И подписка работает отлично на свитке Хорошо, теперь давайте посмотрим на всех из них: Новости, Видео, Темы. Хорошо, теперь прокрутите вниз и ... У меня есть три экземпляра шаблона подписчика, который будет подписываться на их собственные публикации, потому что они не уничтожаются при переключении маршрутов. –

+0

С примером кода: https://forums.meteor.com/t/re-create-template-while-switching-routes/28138 –

ответ

0

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

Самый простой способ управлять каждым из ваших представлений - убедиться, что контекст данных для определенного вида использует .find() с запросом, который вам нужен. Обычно это будет тот же запрос, что и ваша публикация.

Другой, но менее эффективный подход - это .stop() подписка, когда вы покидаете представление.

+0

Привет, Мишель! Спасибо за ответ! Нет, на самом деле я не использую несколько подписчиков. У меня есть динамическая подписка, которая должна изменять параметры, когда я иду по другому маршруту. Маршрут имеет мастер-шаблон, который имеет тот же шаблон-подписчик, но с другими параметрами. И да, вы абсолютно правы в .stop() в template.onDestroyed(). И да, теперь это работает для меня. Но, когда я загружаю другую страницу, я получаю эту ошибку в консоли: Ошибка с нечистым: не удается вызвать View # subscribe изнутри разрушенного обратного вызова, попробуйте вызвать его внутри созданного или отображаемого. Теперь я обновлю вопрос. –

+0

Вы выполняете 'this.sop()', но 'this.sub' является функцией' autorun', а не самим объектом подписки! –

+0

Ehm ... не был обновлен код с частью экспериментов. В обновленном коде я использую Template.autorun и Template.subscribtion. Фактически, это прекратит отслеживание и подписки, когда шаблон будет уничтожен. –

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

  • Нет связанных вопросов^_^