Meteor / Iron-Router:如何使用settings.json中的数据定义路由

时间:2014-08-21 09:17:28

标签: meteor iron-router

对于路径适用的URL,我在settings.json中定义了一个部分,就像这个

一样
baseUrl: '/private'

我的设置已发布,可通过集合“设置”(在客户端上)访问。所以我尝试了以下内容:

Meteor.subscribe('settings');

Deps.autorun(function () {
    var settings = Settings.findOne():

   if (settings) {
        Router.map(function () {
            this.route('project', {
                path: settings.baseUrl + '/:projectId,
               controller: 'ProjectController'
            });
        });
   } 
});

问题是在初始化期间,数据尚未在客户端可用,因此我必须等到数据存在。到目前为止,这种方法还不起作用。但在花了好几个小时之前,我想知道是否有人之前已经这样做过,或者可以告诉我这是否是正确的做法?

1 个答案:

答案 0 :(得分:1)

更新的答案:

我在存储库中发布了解决方案:https://github.com/parhelium/meteor-so-inject-data-to-html 。通过打开url:localhost:3000 / test

进行测试

在这种情况下,FastRender软件包没用,因为injects collection data in the end of head tag - >第63行。

注入 - 初始包injects data in the beginning of head tag - >第106行。

需要的包裹:

  mrt add iron-router
  mrt add inject-initial

源代码:

Settings = new Meteor.Collection("settings");
if (Meteor.isClient) {

    var settings = Injected.obj('settings');
    console.log(settings);
    Router.map(function () {
        this.route('postShow', {
            path: '/'+settings.path,

            action: function () {
                console.log("dynamic route !");
            }
        });
    });
}

if (Meteor.isServer){
    if(Settings.find().count() == 0){
        Settings.insert({path:"test",data:"null"});
    }

    Inject.obj('settings', Settings.findOne());
}

请阅读页面底部的安全性:https://github.com/gadicc/meteor-inject-initial/

OLD ANSWER:

以下解决方案在此特定情况下无法工作,因为FastRender会在head标记的末尾注入数据。因为在注入数据出现之前,路由被初始化。

当来自Settings集合的数据与html一起发送时,它将起作用。 您可以使用包FastRender来执行此操作。

创建文件server/router.js

 FastRender.onAllRoutes(function(path) {
     // don't subscribe if client is downloading resources
     if(/(css|js|html|map)/.test(path)) {
         return;
     }
     this.subscribe('settings');
 }); 

同时创建publish功能:

Meteor.publish('settings', function () {
     return Settings.find({});
});

以上代码表示如果用户打开您应用的任何网址,则客户端将订阅"设置"发布和数据将在服务器上注入html,并立即供客户使用。

我使用这种方法能够将许多不同的域连接到meteor app并相应地发送适当的数据。