所以我有一个简单的视图,显示项目和该项目中的故事。在铁路由器我称之为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')})
但是,这并不适合将其纳入模板。我究竟做错了什么?
答案 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
。这将在订阅完成之前显示。