Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何强制Meteor重新加载订阅?_Meteor - Fatal编程技术网

如何强制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