Meteor铁路:在路由之间传递数据

12
我该如何在不同的路由和模板之间传递数据?
我有一个位于前端(client文件夹)的JavaScript文件,它简单地调用Router.go()函数并传递文章ID作为其中的一个参数。
以下是我认为的三个主要问题。我已将大部分代码删除以便更易阅读。我可以顺利切换到“PostDetail”页面。我还可以从Router上获取“PostId”。但我的问题是,检索到的数据库条目(POLL)并没有在模板中呈现出来。因此,尽管数据库条目被返回,{{Question}}仍然为空。
如果需要更多信息,请告诉我。
FrontEnd.js
Template.PostTiles.events({
  // When a choice is selected
  'click .pin' : function(event, template) {        
    Router.go('Post', {_PostId: this.PostId});    
  }
});

文章详情页.html

<template name="PostDetail">
    <h3>{{Question}}</p>
</template>

Shared.js

Router.map( function() {

    this.route('Home', {
        path: '/',
        template: 'PostTiles',
        data: {
            // Here we can return DB data instead of attaching 
            // a helper method to the Template object
            QuestionsList: function() {
                return POLL.find().fetch();
            }           
        }
    });

    this.route('Post', {
        template: 'PostDetail',
        path: '/Post/:_PostId',
        data: function() {          
            return POLL.findOne(this.params._PostId); 
        },
        renderTemplates: {
            'disqus': {to: 'comments'}
        }
    });

});

----- 更新 -----

我认为问题的症结在于只能渲染一个数据库条目,而不能使用{{#each SomeList}}语法来渲染列表。

2个回答

2

看起来你已经找到答案/解决了这个问题,但是以防万一,我认为问题可能出在你的findOne语句中:

data: function() {          
        return POLL.findOne(this.params._PostId); 
    },

请阅读:

data: function() {          
        return POLL.findOne({_id:this.params._PostId}); 
    },

(假设POLL按_id列出了您的帖子。)
希望这有所帮助。

0

我认为在一般情况下,会话(Session)是一个很好的传递数据的方式,但在这种情况下更多的是语法问题。 - Free Lancer
会话在路由之间没有持久化。 - Joseph
3
会话(session)是全局持久化对象。 - Piotr Stulinski
@PeterStulinski 在 Meteor 中不行,除非你将持久会话包添加到 Meteor 中 :) - Pwnball
@Pwnball 会话在路由之间是持久化的,但在页面刷新(例如在浏览器上点击“刷新”按钮)时并不是持久化的。如果您需要这种功能,您需要使用一个包,该包使用本地存储来在刷新时重新加载它们。Iron router 导航时不会导致“页面刷新”,因此您不需要这个包。 - Piotr Stulinski
无论如何,Iron Router 在路由函数内调用 this.next() 后会导致页面刷新,因此客户端上 Meteor 的 Session 数据会丢失。 - Eric Majerus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接