示例:
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
};
}
});
如您所见,此模板/路线有两个集合Book
和Chapter
。以前,我曾经像这样单独调用这些集合:
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
之类的内容,因此它无法识别模板。
答案 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._id
或this.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提供了访问当前数据上下文以及父数据上下文的实用程序,这可能很有用: