Meteor/Iron-Router: how to define routes using data from settings.json

本秂侑毒 提交于 2019-12-25 03:44:58

问题


For the URL to which a route applies I have a part defined in settings.json, like this

baseUrl: '/private'

My settings are published and accessible through the collections 'Settings' (on the client). So I tried the following:

Meteor.subscribe('settings');

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

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

The problem is that during initialisation the data is not yet on the client available, so I have to wait until the data is present. So far this approach doesn't work (yet). But before spending many hours I was wondering if someone has done this before or can tell me if this is the right approach ?


回答1:


Updated answer:

I published solution in repository : https://github.com/parhelium/meteor-so-inject-data-to-html . Test it by opening url : localhost:3000/test

In this case FastRender package is useless as it injects collection data in the end of head tag -> line 63.

Inject-Initial package injects data in the beginning of head tag -> line 106.

Needed packages:

  mrt add iron-router
  mrt add inject-initial

Source code:

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());
}

Read about security in the bottom of the page : https://github.com/gadicc/meteor-inject-initial/

OLD ANSWER :

Below solution won't work in this specific case as FastRender injects data in the end of head tag. Because of that Routes are being initialized before injected data is present.

It will work when data from Settings collection will be sent together with html. You can do that using package FastRender.

Create file 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');
 }); 

Create also publish function:

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

The above code means that if user open any url of your app then client will subscribe to "settings" publication and data will be injected on the server into html and available for client immediately.

I use this approach to be able to connect many different domains to meteor app and accordingly sent proper data.



来源:https://stackoverflow.com/questions/25422567/meteor-iron-router-how-to-define-routes-using-data-from-settings-json

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!