Meteor+MongoDB:如何获取嵌套数据
Meteor + MongoDB: How to get nested data?
我是Meteor的新手,正在努力解决这个问题。
我正试图根据所经过的路线从"课程"集合加载数据。例如,如果/课程/level1/lesson1/1a通过,则显示数据
不幸的是,这不起作用。
我走的是正确的道路还是有更好的方法?
收藏
{
"_id": "YSgr3fvjpEBn7ncRa",
"courseId": "level1",
"lesson": [
{
"lessonId": "lesson1",
"freeLesson": true,
"title": "Lesson 1",
"eachLesson": [
{
"eachLessonId": "1a",
"title": "This is (masculine)",
"video": "839843"
},
{
"eachLessonId": "1b",
"title": "That is (masculine)",
"video": "839843"
},
{
"eachLessonId": "1c",
"title": "This is (feminine)",
"video": "839843"
},
{
"eachLessonId": "1d",
"title": "That is (feminine)",
"video": "839843"
},
{
"eachLessonId": "1e",
"title": "Getting to know you",
"video": "839843"
}
]
}
]
}
路线
Router.route("courses/:courseId/:lessonId/:eachLessonId", {
path:"/courses/:courseId/:lessonId/:eachLessonId",
layoutTemplate: "layoutLessons",
template:"lessons",
onBeforeAction:function(){
var currentUser = Meteor.userId();
if (currentUser) {
Session.set('courseId', this.params.courseId);
Session.set('lessonId', this.params.lessonId);
Session.set('eachLessonId', this.params.eachLessonId);
this.next();
} else {
Router.go('/')
}
},
});
模板助手
Template.lessons.onCreated(function(){
Meteor.subscribe('listLessons');
});
Template.lessons.helpers({
currentLesson: function() {
var currentLesson = Session.get('eachLessonId');
return Lessons.find({"lesson.eachLesson.eachLessonId" : currentLesson});
},
});
HTML
{{#each currentLesson}}
{{title}}
{{video}}
{{/each}}
您可以使用Iron Router的waitOn
和data
选项,而不是将courseId
、lessonId
和eachLessonId
存储为Session
值。
例如,您可以按如下方式重写您的路线:
Router.route('/courses/:courseId/:lessonId/:eachLessonId', {
name: 'lessons',
layoutTemplate: 'layoutLessons',
template: 'lessons',
onBeforeAction: function() {
let currentUser = Meteor.user();
if (currentUser) this.next();
else Router.go('/');
},
data: function() {
var doc = Lessons.findOne({
"courseId": this.params.courseId,
"lesson.lessonId": this.params.lessonId,
"lesson.eachLesson.eachLessonId": this.params.eachLessonId
});
if (doc) {
var lesson = {};
var lessonId = this.params.eachLessonId;
_.each(doc.lesson, function(i) {
lesson = _.find(i.eachLesson, function(j) {
return j.eachLessonId == lessonId;
});
});
return lesson;
}
return {};
},
waitOn: function() {
return [
Meteor.subscribe('lesson', this.params.courseId, this.params.lessonId, this.params.eachLessonId)
];
}
});
这应该将数据上下文设置为请求的eachLesson
对象。但是,您可以考虑将数据上下文设置为Lessons
集合中的文档,然后只拾取某些eachLesson
对象。此外,您应该创建一个发布函数,只返回请求的Lessons
文档,而不是所有文档,就像您现在在listLessons
出版物中可能做的那样。您可以将所有ID作为参数传递给相应的发布函数。
相关文章:
- 如何使用javascript获取嵌套对象中所有子对象的单个属性
- 如何递归地获取嵌套对象中所有子对象的列表
- 在JSP中获取嵌套形式的select列表值
- 如何使用get()获取嵌套的Scope属性
- Angular ui.grid 获取嵌套行
- Meteor+MongoDB:如何获取嵌套数据
- 使用 javascript 通过 tag->id->element 获取嵌套元素
- 获取嵌套在多个类中的值
- 无法从JSON中获取嵌套对象
- 如何使用underscorejs获取嵌套对象的内部数组
- 如何在sencha touch中获取嵌套列表
- 使用 chrome.storage.sync 保存/获取嵌套对象
- 获取嵌套在聚合物纸张对话框中的自定义Web组件内内容的客户端高度
- 获取嵌套 for 循环中的值 - node.js、javascript、redis、Q 库
- 如何从服务器获取嵌套路由 ember 2.3.0 的数据
- 获取嵌套网格视图中图像鼠标悬停的动态详细信息
- 如何获取嵌套在两个赋值函数和一个 forEach 循环中的值
- 通过搜索 td 文本获取嵌套表 ID
- 是否可以在不使用浏览器插件的情况下在标准 Web 应用程序中获取嵌套文件夹信息
- 如何在java脚本中获取嵌套json对象中的所有键