在路由器中订阅

时间:2015-04-03 23:17:34

标签: meteor

我想订阅特定网页上的数据,因此我将subscribe()放在router.js内。我不确定是否应将其封入Meteor.isClient()块内。我是不是该?我什么时候会为服务器端做路由?

Router.route('/courses/:_id', function () {
  if (Meteor.isClient) {
    Meteor.subscribe("comments");
  }
  this.render('CourseDetail', { .. });
 });

3 个答案:

答案 0 :(得分:0)

无需使用Meteor包装器。 Iron路由器有自己的语法,用于说明您希望路由运行的位置。

这是一个例子。

Router.route('/item', function () { var req = this.request; var res = this.response; res.end('hello from the server\n'); }, {where: 'server'});

这是docs网站。

https://github.com/iron-meteor/iron-router/blob/devel/Guide.md

答案 1 :(得分:0)

您应该在铁路由器路由的onBeforeAction选项中定义订阅。

Router.route('/courses/:_id', function () {
    onBeforeAction: function () {
        Meteor.subscribe("comments");
    },
    action: function (){
        this.render('CourseDetail', { .. });
    }
});

Source

答案 2 :(得分:0)

您可以简单地删除该检查,并将文件放在应用程序目录中的顶级if (Meteor.isClient){}文件夹中,而不是将router.js检查放在client文件中。这样,您根本不必担心在服务器上处理您的路由。在进行更改时,您可以通过以下两种方式之一构建上面的路径定义:

Router.route('/courses/:id', function() {
    this.wait(Meteor.subscribe('comments')); // Either this one
    this.subscribe('comments').wait(); // or this one. DO NOT DO BOTH.

    if(this.ready()) {
        this.render();
    } else {
        this.render('CourseDetail');
    }
});

或:

Router.route('/courses/:id', {
    subscriptions: function() {
        this.subscribe('comments');
    },
    action: function() {
        this.render('CourseDetail');
    }
});

请注意,第一个选项将函数作为第二个参数传递给Router.route()函数,而第二个选项将一个对象作为第二个参数传递给Router.route()函数。这两个选项都完全有效。有关第一个选项的信息,请检查this;有关第二个选项的信息,请检查this

至于何时进行服务器端路由,如果要为外部应用程序设置应用程序的HTTP请求/响应部分以访问服务器,通常会执行此操作。除非是这种情况,否则您很可能永远不必担心设置这样的事情。但是,在执行此操作的情况下,您将定义路由并将它们放在应用程序目录的顶级server文件夹中。有关服务器端路由的信息,请检查this输出。