对于路径适用的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'
});
});
}
});
问题是在初始化期间,数据尚未在客户端可用,因此我必须等到数据存在。到目前为止,这种方法还不起作用。但在花了好几个小时之前,我想知道是否有人之前已经这样做过,或者可以告诉我这是否是正确的做法?
答案 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/
以下解决方案在此特定情况下无法工作,因为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并相应地发送适当的数据。