2016-07-16 3 views
0

После прочтения документации о публикации REST ресурсов и остановки подписки, я был в состоянии кодировать что-то вроде этого:Как отказаться от подписки после остановки подписки в Метеор?

(с использованием радиально-Метеор)

публикации:

Meteor.publish('numbers', function(token){ 

    const res = HTTP.get(API, { headers: {'token-header': token }}); 

    _.forEach(res.data, (value, key) => { 
     this.added('numbers', key, { name: value }); 
    }); 

    this.ready(); 
}); 

Подписка:

class Ctrl{ 
    constructor($scope, $reactive, $localStorage){ 
     'ngInject'; 
     $reactive(this).attach($scope); 

     this.subscriber = this.subscribe('numbers',() => { 
     return [$localStorage.token]; 
     }); 

     this.helpers(){ numbers(){ return Numbers.find(); }} 
    } 

    refresh(){ 
     this.subscriber = this.subscribe('numbers',() => { 
     return [$localStorage.token]; 
     }, { 
     onReady:() => { console.log('stopping refresh animation'); } 
     }); 
    } 
} 

//more Angular code... 

Предположим, что это значения, возвращаемые API:

[ 'Alpha', 'Bravo', 'Charlie', 'Delta', 'Echo', 'Foxtrot' ] 

Все работает хорошо при загрузке первой страницы. Тем не менее, я заметил, что когда я спросил только Альфа, Браво и Чарли на обновления, Delta, Echo и Фокстрот по-прежнему остается в кэше Minimongo.

Я попытался добавить subscriber.stop() в функцию обновления, чтобы удалить данные из кеша, но я не смог получить this.subscribe(), чтобы снова работать.

Поэтому у меня есть два вопроса:

  1. Как подписаться снова после остановки подписки?
  2. Есть ли другой способ, чем оформить подписку?

С другой стороны, я смотрю на Apollo в качестве альтернативы. Я еще не пробовал это, но вы бы, ребята, рекомендовали его для производства, предполагая, что я знаю, что я с ним делаю?

ответ

0

Ну, я чувствую себя глупо. Я переусердствовал над проблемой. Использовать Meteor.apply() было бы достаточно для моего дела.

Вот код:

Сервер

Meteor.methods({ 
    'retrieveNumbers' (token){ 
     const res = HTTP.get(API, { headers: {'token-header': token }}); 
     return res.data; 
    } 
}); 

Клиент

class Ctrl{ 
    constructor($scope, $reactive, $localStorage){ 
     'ngInject'; 
     $reactive(this).attach($scope); 
     this.$localStorage = $localStorage; 

     this.retrieveNumbers(); 
    } 

    retrieveNumbers(){ 
     this.apply('retrieveNumbers', [this.$localStorage.token], (err, res) => { 
     this.numbers= res; 
     }); 
    } 
} 

//more Angular code... 

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

+0

Я считаю, что вы должны были очистить после публикации при отмене подписки (с помощью обратного вызова). Так же, как вы назвали 'this.added', когда вы создали подписку, вы должны были сделать' this.removed', когда он остановлен (на сервере). Это затраты на это вручную. – MasterAM

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