Javascript 如何反应性地呈现自己的对象实例?(不是光标对象)

Javascript 如何反应性地呈现自己的对象实例?(不是光标对象),javascript,mongodb,meteor,iron-router,Javascript,Mongodb,Meteor,Iron Router,我正试图在meteor中构建一个相当明显的代码模式,但我觉得我一定是做错了,因为反应性在折磨我 我想创建自己的对象实例,然后将其传递给模板进行渲染。随着对象内部状态的更改,模板应该神奇地更新reacti 例如,玩家进入一个页面,我只想创建这个对象的一个实例。它不是mongo查找或游标,而是我自己的类 因此,理想情况下,我会在路由器中的onRun()事件中创建对象,然后将该对象传递给要渲染的数据 下面的代码允许我获取对象,但在其内部状态更改时不更新模板 如果我将对象放入会话,我会得到: Uncau

我正试图在meteor中构建一个相当明显的代码模式,但我觉得我一定是做错了,因为反应性在折磨我

我想创建自己的对象实例,然后将其传递给模板进行渲染。随着对象内部状态的更改,模板应该神奇地更新reacti

例如,玩家进入一个页面,我只想创建这个对象的一个实例。它不是mongo查找或游标,而是我自己的类

因此,理想情况下,我会在路由器中的onRun()事件中创建对象,然后将该对象传递给要渲染的数据

下面的代码允许我获取对象,但在其内部状态更改时不更新模板

如果我将对象放入会话,我会得到:

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游标来对其进行后端处理。在这种情况下,使用创建的回调而不是呈现的回调不是更好吗?所以助手不会被调用两次。