Javascript 如何反应性地呈现自己的对象实例?(不是光标对象)
我正试图在meteor中构建一个相当明显的代码模式,但我觉得我一定是做错了,因为反应性在折磨我 我想创建自己的对象实例,然后将其传递给模板进行渲染。随着对象内部状态的更改,模板应该神奇地更新reacti 例如,玩家进入一个页面,我只想创建这个对象的一个实例。它不是mongo查找或游标,而是我自己的类 因此,理想情况下,我会在路由器中的onRun()事件中创建对象,然后将该对象传递给要渲染的数据 下面的代码允许我获取对象,但在其内部状态更改时不更新模板 如果我将对象放入会话,我会得到:Javascript 如何反应性地呈现自己的对象实例?(不是光标对象),javascript,mongodb,meteor,iron-router,Javascript,Mongodb,Meteor,Iron Router,我正试图在meteor中构建一个相当明显的代码模式,但我觉得我一定是做错了,因为反应性在折磨我 我想创建自己的对象实例,然后将其传递给模板进行渲染。随着对象内部状态的更改,模板应该神奇地更新reacti 例如,玩家进入一个页面,我只想创建这个对象的一个实例。它不是mongo查找或游标,而是我自己的类 因此,理想情况下,我会在路由器中的onRun()事件中创建对象,然后将该对象传递给要渲染的数据 下面的代码允许我获取对象,但在其内部状态更改时不更新模板 如果我将对象放入会话,我会得到: Uncau
Uncaught RangeError: Maximum call stack size exceeded ejson.js?
通过将其插入路由器的@params中,我可以将其从onRun传递到数据,但这似乎是一种黑客行为
有没有其他更好的方法来创建自己类型的对象,然后将其传递到模板中进行反应式渲染?或者我需要深入研究Deps.autorun()并设置自己的Deps跟踪来实现这样一个简单的任务吗
@route 'magnets',
path: '/magnets/lesson/:lessonCname/:subTopic?'
waitOn: ->
Meteor.subscribe('MagnetsQuery', {lessonCname: @params.lessonCname}, {} )
onBeforeAction: ->
console.log("onRun")
if @ready()
if @params.deck
console.log('already had a deck')
else
deck = new DialogDeck(@params.lessonCname)
Template.magnets.deck = deck
console.log('created deck', deck)
@params.deck = deck
data: ->
obj = {
deck: @params.deck
lessonCname: @params.lessonCname
subTopic: @params.subTopic
}
console.log('data', obj)
return obj
您可以将一个应用程序合并到DialogDeck
中,使其成为反应式数据源。关于如何做到这一点,有一个很好的教程
完成后,在模板函数中创建deck
。与onBeforeAction
iron路由器挂钩不同,它不是被动的,因此deck
只创建一次
下面是一个简单的示例,使用单个依赖项
处理整个对话框组
对象
function DialogDeck (lessonCname) {
this.lessonCname = lessonCname;
this.dep = new Deps.Dependency;
};
var deck;
Template.magnets.created = function () {
deck = new DialogDeck(this.data.lessonCname);
};
Template.magnets.deck = function () {
deck.dep.depend();
return deck;
};
Template.magnets.events({
'click button': function () {
deck.lessonCname = 'something different';
deck.changed();
}
});
当然,在呈现模板时,您可以使用更多的依赖项来实现更大的粒度。是什么改变了对象的内部状态?我在页面上有一些按钮可以调用其中的方法。即使从控制台更改对象的简单属性也不会更新。我想我可能需要深入研究Deps,或者只是创建一个简单的mongo游标来对其进行后端处理。在这种情况下,使用创建的回调而不是呈现的回调不是更好吗?所以助手不会被调用两次。