1

所以我有一个简单的视图,它显示了一个项目和该项目中的故事。在铁路由器中,我将其称为 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')})

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

4

2 回答 2

1

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

你应该返回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...
于 2013-11-07T06:28:30.700 回答
0

你可以这样做而不是waitOn

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

确保您已设置您的loadingTemplate. 在订阅完成之前会一直显示。

于 2013-11-07T06:43:42.363 回答