Meteor/Iron路由器:如何使用settings.json中的数据定义路由
对于应用路由的URL,我在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 () {
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',{…})服务器上的code>并在客户机上获取数据Injected.obj('myData')代码>但我仍然对如何将其与集合初始化结合使用非常感兴趣。更新答案。