铁路由器,发布和订阅

时间:2013-11-07 02:51:10

标签: meteor publish-subscribe iron-router

所以我有一个简单的视图,显示项目和该项目中的故事。在铁路由器我称之为projectShow路线:

@route 'projectShow', {   
  path: '/projects/:_id', 
  template: 'projectsShow'
}

我的模板是

<template name="projectsShow">
  <div class="row">         
    I'm a project            
    {{name}}
    <a href="#" id="add-story">New Story</a>
    {{#each stories}}
      Title: {{title}}
    {{/each}}
  </div>
</template>

因此,绊倒我的部分正确地从服务器中选择数据并将其提供给客户端。我试过的是这样发布:

if Meteor.isServer
  Meteor.publish "projectAndStories", (id) ->
    [Projects.findOne({_id: id}), Stories.find({projectId: id})]

我不清楚的是在路由器/客户端正确订阅的地方和方法,以及设置会话变量以便我可以在添加新故事时引用当前项目

我试过了:

# in route
waitOn: ->
  Meteor.subscribe('projectAndStories', @params._id)
  Session.set('projectId', @params._id)

# template js file
  Template.projectShow.project = Projects.findOne({_id: Session.get('projectId')})
  Template.projectShow.stories = Stories.find({projectId: Session.get('projectId')})

但是,这并不适合将其纳入模板。我究竟做错了什么?

2 个答案:

答案 0 :(得分:1)

在您的示例中,您将在waitOn闭包中返回Session.set('projectId', @params._id)

您应该返回 Meteor.subscribe 。只需交换线路。


问题多于上面的问题,所以我决定在js中重新创建你的项目并且它有效。 请查看存储库: https://github.com/parhelium/stackoverflow-iron-pub-sub

我注意到的问题:

// Template.projectShow:   
{{name}} -> {{project.name}}

// waitOn closure should return:
Meteor.subscribe('projectAndStories', @params._id)

我在创建项目时遇到的问题:

// assign p to projectId, NOT p._id 
var p = Projects.insert({
    name: "Project #"+i,
});
Stories.insert({
    title: "Story #"+j,
    projectId:p
});

// check if data in mongo is correct, projectId was null in my case...

答案 1 :(得分:0)

您可以执行此操作而不是waitOn

before: ->
    this.subscribe("projectAndStories",@params.id).wait();
    Session.set('projectId', @params._id)

确保您已设置loadingTemplate。这将在订阅完成之前显示。