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

Meteor/Iron路由器:如何使用settings.json中的数据定义路由,meteor,iron-router,Meteor,Iron Router,对于应用路由的URL,我在settings.json中定义了一个部分,如下所示 baseUrl: '/private' 我的设置通过集合“设置”(在客户端上)发布和访问。因此,我尝试了以下方法: Meteor.subscribe('settings'); Deps.autorun(function () { var settings = Settings.findOne(): if (settings) { Router.map(function () {

对于应用路由的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'
            });
        });
   } 
});
问题是,在初始化过程中,客户机上的数据还不可用,因此我必须等待数据出现。到目前为止,这种方法还不起作用。但在花很多时间之前,我想知道是否有人曾经这样做过,或者可以告诉我这是否是正确的方法?

更新答案: 我在存储库中发布了解决方案: . 通过打开url:localhost:3000/Test进行测试

在这种情况下,FastRender包是无用的,因为它->第63行

注入初始包->第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());
}
阅读页面底部有关安全性的内容:

旧答案: 下面的解决方案在这种特定情况下不起作用,因为
fastdrender
在head标记的末尾注入数据。因此,在注入数据出现之前,路由将被初始化。

当来自设置集合的数据与html一起发送时,它将起作用。 您可以使用软件包来实现这一点

创建文件
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({});
});
上面的代码意味着,如果用户打开你的应用程序的任何url,那么客户端将订阅“设置”出版物,数据将在服务器上注入html并立即供客户端使用


我使用这种方法可以将许多不同的域连接到meteor应用程序,并相应地发送适当的数据。

我已经使用教程完成了这项工作,但这不起作用。我想我一定是做错了什么,然后我才注意到FastRender正在工作。注入的快速呈现代码位于index.html头部的底部,这意味着在初始化集合之前,首先初始化路由。这正是我调试时在应用程序中看到的。我可以做些什么来提前执行集合初始化吗?检查FastRender在引擎盖下使用的包。在发送之前编辑html,请使用:
Inject.rawModHtml(id,func)
。我查看了文档,但不知道如何将其与快速渲染器结合使用。我注意到我可以做
Injected.obj('myData',{…})并在客户机上获取数据
Injected.obj('myData')但我仍然对如何将其与集合初始化结合使用非常感兴趣。更新答案。