为什么即使我已经订阅了该集合(Meteor),文档仍返回 null
Why is the document returning null even though I already subscribed to the collection (Meteor)?
我有一个Books
和Chapters
集合。不言自明:一本书可以有很多章节。
订阅.js:
Meteor.publish("singleChapter", function(id) {
return Chapters.find(id);
});
book_page.js:
Template.bookPage.helpers({
chapters: function() {
Chapters.find({
bookId: this._id
}, {
sort: {
position: 1
}
});
}
});
book_page.html:
<template name="bookPage">
<div class="chapter-list hidden">
<div class="chapter-items">
{{#each chapters}}
{{> chapterItem}}
{{/each}}
</div>
</div>
</template>
chapter_item.html:
<template name="chapterItem">
<div class="chapter clearfix">
<div class="chapter-arrows">
<a class="delete-current-chapter" href="javascript:;">X</a>
</div>
</div>
</template>
现在,我正在尝试获取chapter_item.js
中的当前章节项目:
Meteor.subscribe("singleChapter", this._id); // even tried this but didn't work
Template.chapterItem.events({
"click .delete-current-chapter": function(e) {
e.preventDefault();
var currentChapter = Chapters.find(this._id);
}
});
但是当我这样做时
console.log(currentChapter);
我得到undefined
.我做错了什么?
TL/DR - 跳到 3,因为它可能是最相关的,但为了完整起见,我已经包括了其余部分。
-
我假设您将
console.log...
行放在"click .delete-current-chapter"
回调中?currentChapter
变量将是该函数的本地变量,因此通过在控制台中输入该变量不会获得任何内容。 如果这是显而易见的,请道歉,但不清楚你是否从这个问题中这样做。 -
即使在回调中,
currentChapter
也将是一个光标,而不是一个文档或文档数组。 使用findOne
返回单个文档(或 null(,或使用find(query).fetch()
返回数组(在这种情况下可能只是一个文档(。 -
您尝试在何时何地订阅
singleChapter
? 如果它在回调中,你必须记住这不是一个反应式函数。 这意味着您将订阅(一旦您知道要订阅的_id
(,但在集合实际准备就绪之前立即返回currentChapter
(因此其中没有任何内容(。 在这种情况下,集合准备就绪后,回调不会重新运行,因为事件处理程序不是反应性的。解决此问题的最简单方法是在订阅时使用
onReady
回调,并在其中设置currentChapter
。 另一种方法是事件处理程序中的自动停止Tracker.autorun
,但这似乎有点矫枉过正。 -
最后一点,您需要对具有这种设置的订阅更加小心,因为您可以轻松地为每个客户端累积数十个订阅,而不会停止Iron Router提供的自动订阅。 鉴于此用例,最好在运行回调并删除相关项目后立即停止订阅。
您的发布函数是否正常工作?也许 Mongo 有一个我不知道的功能,但我希望你需要包含{_id:id}
,而不仅仅是 (id(。
Meteor.publish('singleChapter', function(id){
return Chapters.find({_id: id});
});
- Meteor将CRUD操作限制为管理员或文档所有者
- 如何在新的Meteor Collection文档中设置服务器上的created_on字段
- 服务器上的 Meteor.publish 不会在客户端上显示新文档
- Meteor Update集合-未捕获错误:不允许.不受信任的代码只能通过ID更新文档.[403]
- 通过 Meteor / Mongo 返回子文档数组
- 为什么 Meteor 更新会覆盖我的文档中的现有属性
- 为什么即使我已经订阅了该集合(Meteor),文档仍返回 null
- 如何在 Meteor 中使用多个输入字段和单个更新按钮更新文档
- 从 Meteor 中的集合文档返回单个值
- MongoDB(通过Meteor)在更新集合文档时将对象属性视为字符串
- Meteor:更新文档数组中的嵌套对象
- 如何在SimpleSchema Meteor中定义具有自动值的子文档,而不将其插入到每个父文档插入中
- 如何在Meteor JS中检测整个文档上的事件
- Meteor-dons'中的查询子文档;不起作用
- Meteor-如何更新数组中的文档
- Meteor.js/MongoDB:查找文档's在收藏中的位置
- Meteor:能够登录用户从他们的搜索结果中删除文档
- 有没有一种标准的方法可以在某个时间使用Meteor和moment.js从集合中删除Mongo文档
- Meteor AutoForm:如何用子文档数组更新模式值
- 如何使用meteor-jsdoc忽略.meteor目录中的代码文档