如何强制Meteor重新加载订阅?
在我的应用程序中,如何强制Meteor重新加载订阅?,meteor,Meteor,在我的应用程序中,sections是一个集合,通过名为course.sectionIds的属性链接到courses。初始加载工作正常,但在管理面板中添加节时,我遇到了非反应性连接问题 以下是路线: @route'adminCourse', 路径:“admin/course/:course” waitOn:->Meteor.subscribe'course',@params.course 数据:->Course.first() 这些章节包含在课程出版物中: Meteor.publish'cour
sections
是一个集合,通过名为course.sectionIds
的属性链接到courses
。初始加载工作正常,但在管理面板中添加节时,我遇到了非反应性连接问题
以下是路线:
@route'adminCourse',
路径:“admin/course/:course”
waitOn:->Meteor.subscribe'course',@params.course
数据:->Course.first()
这些章节包含在课程出版物中:
Meteor.publish'course',(courseId)->
如果不是this.userId,则返回null
#[一些权限检查]
courses=Course.find courseId
sections=Section.find _id:$in:u.flant courses.map(course)->course.sectionid
[课程及组别]
我知道,但我不能真正使用方法1或方法4(在客户机上过度发布和加入),因为涉及权限检查(您应该只能查看自己课程的部分)。而且,我知道数据何时发生变化,所以它实际上不必是被动的
我只想让Meteor知道在用户提交表单以添加新节时重新加载数据(我目前正在通过在添加节后执行
window.location.reload()
)。有没有办法用Meteor做到这一点?对于感兴趣的人,我通过在发布功能中添加observeChanges
来修复它:
Meteor.publish'course',(courseId)->
如果不是this.userId,则返回null
#[一些权限检查]
courses=Course.find courseId
sectionIds=\u0.PLANT COURES.map(course)->course.sectionIds
handle=courses.observeChanges
已更改:(id,字段)=>
如果有字段,'sectionId'
addedIds=\差异字段.sectionIds,sectionIds
removedIds=u.差异sectionIds,fields.sectionIds
sectionIds=字段。sectionIds
_.每个添加了(id)=>@添加了“节”,id,节。第一个id
_.每个移除的id,(id)=>@移除的“部分”,id
@onStop->handle.stop()
sections=Section.find_id:$in:sectionid
[课程及组别]
观察者检查sectionIds
属性中的更改,并在更改发生时调用订阅上的added
或removed
方法。这使得连接是被动的;将ID添加到courses.sectionID
属性时,新的部分文档将自动推送到客户端。您可以打包:
这里我假设courseId
只匹配一个课程。所以流星相关的作品只有一对多的关系。在上面的代码中,您做了一些多对多的事情
另一种方法是,在所有这些文档(问题、选项、步骤等)中,您都有一个主ID,因此课程ID。然后您只需根据课程ID筛选所有这些文档并将其发布到客户机,然后您在客户机上以您想要的任何层次结构显示这些文档。因此,您不用在读取时计算关系,而是在写入时计算关系,并将该关系的ID存储到您感兴趣的所有文档中
免责声明:我是这个软件包的作者。原来这很简单,现在我觉得有点愚蠢:) 您只需再次调用
Meteor.subscribe()
即可重新加载订阅。我发现这一点时,正在使用另一种解决方案,使用iron router导航到另一个URL,使其重新加载订阅
因此,在我的submit listener中,您可以简单地执行以下操作,而不是执行window.reload()
:
Template.sectionForm.events
“提交表格”:(e)->
e、 预防默认值()
数据=SimpleForm.processForm(event.target)
section=section.create(数据)
此.course.push(节id:section.\u id)
#重新加载订阅以拉入新节
params=Router.current().params
Meteor.subscribe'course',params.producer,params.course
它将吸收新的数据。耶 整洁。我仍然觉得对于一个应该在核心的功能来说,这是一项艰巨的工作。我希望。我知道。。。流星是伟大的,直到你遇到它不做的事情;)@DanDascalescu你确定链接正确吗?似乎没有指向任何主动性。@pinouchon:如果您想在核心中使用此功能,您可能想加入。您也可以查看包。谢谢Mitar,我一定会查看它。这只是一对多的关系:课程1-n部分1-n步骤。我已经将我的“自制”解决方案应用于所有这些,它适用于单链接(使新的节和步骤自动显示),但它还没有完全反应:当一个新的步骤添加到一个新的节时,它不会显示(我猜是因为新的节不在观察更改的结果集中)。你能在meteor related中嵌套关系吗?也许,我还没有测试嵌套关系。我认为你应该重新考虑这个方法。即使你让它工作,这意味着你通过创建一个订阅所做的查询数量是巨大的,如果你有n个部分,那么你将为步骤做n个查询,除非有一些额外的连接魔法和查询优化。但问题是:如果您想使用连接,为什么要使用MongoDB。或者:为什么在MongoDB中使用这样的模式。我认为您正在对关系模式进行修改。尽量简单地使用子文档和数组。MongoDB的整个想法就是让它做一个查询。我知道,我就是这样开始的,但它在我面前彻底崩溃了:/我很难更新步骤和部分(请参阅)。然后我查看了crowducate.me源代码并复制了它们的方法(这是每个对象类型的单独集合,实际上很像RDB)。如果我失踪了
Meteor.publish 'course', (courseId) ->
# verify that courseId is really an ID and not {} or something else
return unless @userId
@related (course) ->
# [some permission checks]
Section.find
_id:
$in: course.sectionIds
,
Course.find courseId