当路由/模板不仅仅是集合时,如何从集合中获取数据?

时间:2014-10-09 14:58:30

标签: javascript meteor

示例:

routes.js:

this.route("chapterPage", {
  path: "/books/:bookId/chapters/:_id",
  data: function() {
    var chapter = Chapters.findOne(this.params._id);
    var book = Books.findOne(this.params.bookId);
    var chapters = Chapters.find({
      bookId: this.params.bookId
    }, {
      sort: {
        position: 1
      }
    });
    return {
      chapter: chapter,
      book: book,
      chapters: chapters
    };
  }
});

如您所见,此模板/路线有两个集合BookChapter。以前,我曾经像这样单独调用这些集合:

chapter_form.js:

Template.chapterForm.events({
  "input #input-content": function() {
    var currentChapter = Session.get("currentChapter");
    Chapters.update(currentChapter, {
      $set: {
        content: $("#input-content").html();
      }
    });
  }
});

但是现在在我的新路线/模板中,我不能这样做,因为它不是基于任何集合:

chapter_page.js:

Template.chapterPage.events({
  "input #input-content": function() {
    console.log(chapter._id); // this returns is not defined 
    console.log(this._id); // this one too
  }
});

如何解决这个问题?

修改

我也试过调用chapter_form.html模板:

<template name="chapterPage">
  {{> chapterForm}}
</template>

但它没有显示和显示类似:Cannot read property 'content' of undefined之类的内容,因此它无法识别模板。

1 个答案:

答案 0 :(得分:1)

您的代码中存在两个问题。

首先在data路线的chapterPage功能中,您没有return包含您数据的对象。

// no return here in your question, need to do :
return {
  chapter: chapter,
  book: book,
  chapters: chapters
};

然后在您的事件处理程序中,您可以使用this访问数据上下文,因此访问章节或图书ID的正确语法为this.chapter._idthis.book._id

编辑:

内部模板路由助手和事件处理程序,this指的是分配给模板的当前数据上下文。

有几种方法可以将数据上下文分配给模板。

您可以使用attribute="value"语法以及模板包含语法。

{{> myTemplate param1="value1" param2="value2"}}

Template.myTemplate.helpers({
  paramsJoined:function(){
    return [this.param1,this.param2].join(",");
  }
});

您还可以使用来自父模板数据上下文的帮助器值:

<template name="parent">
  {{> myTemplate someHelper}}
</template>

Template.parent.helpers({
  someHelper:function(){
    return {
      param1:"value1",
      param2:"value2"
    };
  }
});

如果在使用模板包含语法时未指定数据上下文,则假定它是从父数据上下文继承的。

您还可以使用{{UI.dynamic}}http://docs.meteor.com/#ui_dynamic)指定动态模板名称以及动态数据上下文。

{{> UI.dynamic template=Router.template data=Router.data}}

这是iron:router用于动态设置路由模板的路由数据上下文的方法(虽然实现稍微复杂一些)。

Meteor提供了访问当前数据上下文以及父数据上下文的实用程序,这可能很有用:

http://docs.meteor.com/#template_currentdata

http://docs.meteor.com/#template_parentdata