2015-08-18 2 views
0

Я почесываю голову, потому что я помню этот точный код, работающий в какой-то момент в прошлом. Когда test создается и отображается, я устанавливаю значение this.data, но я не могу получить его в событиях или помощниках. Я начинаю думать, что пакет или что-то испортил мой Метеор.Почему мои данные шаблона шаблона Meteor не сохраняются?

<template name="test"> 
    <button>click me</button>  
</template> 
Template.test.onCreated(function(){ 
    // here I am setting the data context of the test template 
    this.data = { 
    doors: 5 
    }; 

    // when I hover over `this` in Chrome is indeed shows the object 
    debugger 
}); 

Template.test.onRendered(function(){ 

    this.data = { 
    wheels: 4 
    }; 
    // when I hover over `this` it also shows the object 
    debugger 

    var changeDataContext = function(obj){ 
    this.data = obj; 
    }; 

    changeDataContext({engine: 1}); 

    // when I hover over `this` it shows the old value of `this`, not the new one with {engine: 1} 
    this; 
    debugger 
}); 


Template.test.events({ 

    'click button': function(e, tmpl){ 
    tmpl; 

    // when I hover over `tmpl` it shows null for `data`??? 
    debugger 
    } 

}); 

Template.test.helpers({ 

    images: function() { 
    this; 

    // when I hover over `this` it shows null for the value of `this`??? 
    debugger 
    return this.wheels; 
    } 

}); 

EDIT

Вот является MeteorPad изложением проблемы:

http://meteorpad.com/pad/Cqw3fWieJfspK2eYv/Leaderboard

ЗАКАНЧИВАТЬ отчетность отладчик здесь:

http://app-5p5urzku.meteorpad.com/

ответ

2

Это проблема с вашими областями. Во-первых, для onRendered, вы не можете использовать this внутри функции и ожидать, что она будет рассматриваться как this из высшей сферы:

Template.test.onRendered(function(){ 

    this.data = { 
    wheels: 4 
    }; 

    var self = this; // we save this scope's `this` for later 

    var changeDataContext = function(obj){ 
    this.data = obj; // here, `this` refers to the current scope, ergo your changeDataContext function! onRendered's `this` does not get altered. 
    self.data = obj; // here, we refer to the `self` variable that you set earlier. It should work. 
    }; 

    changeDataContext({engine: 1}); 

    // tadaaaaaaaaaa 
    this; 
    debugger 
}); 

Тогда для помощникам: this представляет контекст данные, а не экземпляр шаблон. Если вы хотите экземпляр шаблона, используйте Template.instance():

Template.test.helpers({ 

    images: function() { 
    var tmpl = Template.instance(); 
    if (tmpl.data) 
     return tmpl.data.wheels; 
    } 

}); 

Обратите внимание: контекст данных отличается от Template.instance().data. Вы не можете поместить вещи в this.data в onCreated и ожидать, что сможете использовать его в шаблоне Spacebars. Железный маршрутизатор просто хранит его там для удобства.

Что касается вашего мероприятия ... Ну, там, он должен работать. То, что вы написали, должно показать вам wheels. Может быть, вы заранее изменили свой пример data? Разумеется, вы можете использовать Template.instance() вместо tmpl

+0

Хммм .. Наверное, я запутался между «контекстом данных» и просто, ну, данными. Я хочу скопировать некоторые данные внутри экземпляра шаблона. Не является ли «контекст данных» значениями внутри ключа 'data', который имеет экземпляр шаблона? – fuzzybabybunny

+0

Нет! Как я сказал в своем «Обратите внимание», они разные. Контекст данных обычно устанавливается с помощью помощников, вашего маршрутизатора или включения родительского шаблона. 'Template.instance(). Data' - это только удобное свойство, которое, как я полагаю, использует утюг-маршрутизатор (и другие, я полагаю), чтобы хранить то, что он положил в контексте данных, для легкого доступа к javascript-коду вашего шаблона. Установка чего-то в 'data' вашего экземпляра шаблона не добавляет его в свой контекст данных. – SylvainB

+0

Чтобы уточнить, «контекст данных» по существу задает тот, кто вызывает шаблон, а не сам шаблон. «Аргументы» к шаблону, если хотите. Если вы хотите хранить вещи внутри экземпляра шаблона, поместите их внутри 'this.whatever' внутри' onRendered'/'onCreated'/etc, и вы можете получить к ним доступ, используя' Template.instance(). Any' in helpers или используя второй аргумент 'tmpl.whatever' в обработчиках событий. – user3374348