2016-12-15 9 views
0

Я использую Meteor 1.4.this.subscribe и Template.instance(). Подписка не работает

Template.showProducts.onCreated(() => { 
    var handle = Meteor.subscribe("products"); 
    //not working: var handle = this.subscribe("products"); 
    //not working: var handle = Template.instance().subscribe("products"); 

    Tracker.autorun(() => { 
    //not working: this.autorun 

    const isReady = Meteor.ready(); 
    //not working: this.subscriptionsReady() 

    if(isReady){ 
     const products = Products.find().fetch(); 
     Session.set("prods", products); 
    } 
    }); 
}); 

Если я использую "this.subscribe", я получил:

Uncaught TypeError: _this.subscribe is not a function

Если я использую "Template.instance()", я получил:

Cannot read property 'subscriptionsReady' of null

ответ

2

Если вы используете функция стрелки, то теряется значение this, которое пытается пройти Метеор. Вместо этого используйте обычную анонимную функцию (function() { ... }).

Затем вы должны использовать this.autorun, а не Tracker.autorun. Это обеспечит очистку автозапуска при исчезновении шаблона и позволит Template.instance работать внутри автозапуска.

2

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

Исправление просто передать onCreated традиционную функцию JS:

Template.showProducts.onCreated(function() { 
    ...