无法加载Meteor模板,设置上下文和绑定事件

时间:2013-12-09 15:54:20

标签: node.js templates meteor

我正在尝试渲染并将模板(ticket_edit)附加到正文。我需要为新附加的模板设置一个上下文,并且ticket_edit的事件应该绑定到该模板。

代码:

Template.ticket.events = {
    'click a.edit' : function (event) {
        //when the edit button has been clicked, load template 'ticket_edit' 
        //with the current context. Please see situation 1 and 2.
    }   
}

Template.ticket_edit.events = {
     'click a.save' : function (event) {
        //this won't do anything when i have supplied a context!
    }
}

所以问题是:

- 我可以设置上下文,但事件不会绑定到新添加的模板。

- 如果我没有设置上下文,事件就会被正确绑定。

但我需要事件和背景。

情况1:

'click a.edit' : function (event) {
    //applying a context to the template will result in events not being bound.
    $('body').append(Meteor.render(Template.ticket_edit(this)));
}

作品2:

'click a.edit' : function (event) {
    //this way, the events will execute properly and i can save my ticket. 
    //However, no context is supplied!
    $('body').append(Meteor.render(Template.ticket_edit));

}

有没有人有这么好的方法呢?我对Meteor很新,所以也许你有一个更好的动态加载模板的方法。

1 个答案:

答案 0 :(得分:2)

不要为此使用jQuery,只需直接使用模板和#with块。像这样:

<body>
  {{> tickets}}
</body>

<template name="tickets">
  {{#each tickets}}
    {{> ticket}}
  {{/each}}

  {{#with currentTicket}}
    {{> editTicket}}
  {{/with}}
</template>

Template.tickets.tickets = function() {
  return Tickets.find();
};

Template.tickets.currentTicket = function () {
  return Tickets.findOne({ _id: Session.get( "currentTicket" ) });
};

Template.ticket.events({
  'click a.edit' : function () {
    Session.set( "currentTicket", this._id );
  }
});

由于我们使用的是#with块,因此在您点击修改按钮(在editTicket中设置"currentTicket")之前,Session模板不会呈现

也可以这样做(没有#with阻止):

{{> editTicket currentTicket}}

但是这会导致editTicket始终被渲染,只有在没有任何上下文之后才会设置Session var。

请注意,因为我们正在使用Session,所以用户不会被重新加载/热代码推送打断。