如何强制Meteor重新加载订阅?

Rij*_*ijk 6 meteor

在我的应用程序中,sections是一个courses由名为的属性链接的集合course.sectionIds.初始加载工作正常,但在管理面板中添加部分时,我遇到了非反应性连接问题.

这是路线:

@route 'adminCourse',
    path: 'admin/course/:course'
    waitOn: -> Meteor.subscribe 'course', @params.course
    data: -> Course.first()
Run Code Online (Sandbox Code Playgroud)

这些部分包含在课程出版物中:

Meteor.publish 'course', ( courseId ) ->
    return null if not this.userId

    # [some permission checks]

    courses = Course.find courseId
    sections = Section.find _id: $in: _.flatten courses.map ( course ) -> course.sectionIds

    [ courses, sections ]
Run Code Online (Sandbox Code Playgroud)

我知道反应性连接,但我不能真正使用方法#1或#4(过度发布和加入客户端),因为涉及权限检查(您应该只能看到自己的课程部分).此外,我知道数据何时发生变化,因此实际上并不一定要被动反应.

当用户提交表单以添加新部分时,我只想让Meteor知道重新加载数据(我目前正在通过在window.location.reload()添加部分后执行此操作来解决此问题).有没有办法用Meteor做到这一点?

Rij*_*ijk 7

对于谁感兴趣,我通过添加observeChanges我的发布功能来修复它:

Meteor.publish 'course', ( courseId ) ->
    return null if not this.userId

    # [some permission checks]

    courses = Course.find courseId
    sectionIds = _.flatten courses.map ( course ) -> course.sectionIds

    handle = courses.observeChanges
        changed: ( id, fields ) =>
            if _.has fields, 'sectionIds'
                addedIds = _.difference fields.sectionIds, sectionIds
                removedIds = _.difference sectionIds, fields.sectionIds
                sectionIds = fields.sectionIds

                _.each addedIds, ( id ) => @added 'sections', id, Section.first id
                _.each removedIds, ( id ) => @removed 'sections', id

    @onStop -> handle.stop()

    sections = Section.find _id: $in: sectionIds

    [ courses, sections ]
Run Code Online (Sandbox Code Playgroud)

观察者检查sectionIds属性的变化,当它发生时,调用订阅上的addedremoved方法.这使得加入反应; 向courses.sectionIds属性添加ID时,新的部分文档现在会自动推送到客户端.

  • 我知道......流星很棒,直到你遇到它不做的事情;) (3认同)
  • 整齐.我仍然觉得这对于应该在核心中的功能来说是一项艰苦的工作.我希望[它成为1.0](https://trello.com/c/BGvIwkEa/48-easy-joins-in-subscriptions). (2认同)

Rij*_*ijk 7

事实证明这很简单,我觉得现在有点愚蠢:)

您只需Meteor.subscribe()再次呼叫即可重新加载订阅.我在弄乱不同的解决方案时发现了这一点,使用铁路由器导航到不同的URL,使其重新加载订阅.

因此,在我的提交监听器中window.reload(),您可以简单地执行以下操作:

Template.sectionForm.events
    'submit form': ( e ) ->
        e.preventDefault()
        data = SimpleForm.processForm( event.target )

        section = Section.create( data )
        this.course.push( sectionIds: section._id )

        # Reload the subscription to pull in the new section
        params = Router.current().params
        Meteor.subscribe 'course', params.producer, params.course
Run Code Online (Sandbox Code Playgroud)

它将引入新数据.好极了!