Javascript 在FlowRouter中定义默认渲染模板的好方法
当迁移到一个新的Meteor项目,用Flow Router替换Iron Router时,我真的错过了Iron Router定义全球可用的默认行为和设置的功能 我知道Flow Router使用“组”构造来定义默认的钩子事件,这些钩子事件可以应用于连接到该组的任何路由,但是似乎没有任何东西可用于定义默认模板Javascript 在FlowRouter中定义默认渲染模板的好方法,javascript,meteor,flow-router,Javascript,Meteor,Flow Router,当迁移到一个新的Meteor项目,用Flow Router替换Iron Router时,我真的错过了Iron Router定义全球可用的默认行为和设置的功能 我知道Flow Router使用“组”构造来定义默认的钩子事件,这些钩子事件可以应用于连接到该组的任何路由,但是似乎没有任何东西可用于定义默认模板 实现这种默认全局或组模板功能的最佳方法是什么?我决定使用一个简单的抽象,它将允许模拟Iron Router的这种功能。我正在尝试评估这是否是一个合理和可扩展的模式,然后再研究如何在FlowRou
实现这种默认全局或组模板功能的最佳方法是什么?我决定使用一个简单的抽象,它将允许模拟Iron Router的这种功能。我正在尝试评估这是否是一个合理和可扩展的模式,然后再研究如何在FlowRouter本身中更直接地集成这一功能,并与寻求类似解决方案的其他人分享这一想法 我只是创建了一个用作参数对象模板的对象,该对象根据需要进行修改,然后在调用BlazeLayout.render时传递 这就是
routes.js
可能的样子:
var appRouteGroup = FlowRouter.group({
name: "appRouteGroup",
triggersEnter: [sometrigger]
});
var appRouteTemplates = {
menuMain: "appNav",
footerMain: "appFooter"
};
appRouteGroup.route("home", {
name: "home",
action: function () {
// We get the default templates
var templates = appRouteTemplates;
// Now we can add the route specific template
templates.content = "homePage";
// Then render with templates passed through the object param
BlazeLayout.render("mainLayout", templates);
}
});
这将允许您呈现默认组模板,而无需为每条管线重新定义它们。和模板标记,如下所示:
<template name="mainLayout">
{{>Template.dynamic template=menuMain}}
{{>Template.dynamic template=content}}
{{>Template.dynamic template=footerMain}}
</template>
{{>Template.dynamic Template=menuMain}
{{>Template.dynamic Template=content}
{{>Template.dynamic Template=footerMain}
我正在寻找一种可能在FlowRouter中进行更直接集成的方法,但这似乎功能完善。有什么改进的想法吗?我想提交我找到的另一个解决方案,它添加了一种更全面的方法,为Flow router创建路由“默认”参数 它使用一个名为: 此包允许将路由定义为一系列“节点”,这些节点可以链接到“父节点”,然后将继承父节点定义中设置的默认参数。看到其他人对该软件包的评论会很有趣。更新如下: 我已经想出了一个我认为相当有效的方法来做这件事 在查看Flow Router的功能时,我注意到Router对象包含一个包含所有组参数的字段,位于
FlowRouter.current().route.group.options
此对象包含组中定义的任何键值对,无论它们是否由Flow Router API使用
然后我决定用它作为一种简单的方法,将一些模板默认值从组传递到路由器
首先是集团定义:
var mainRoutes = FlowRouter.group({
name: "mainRoutes",
defaultTemplates: {
menu: "mainMenu",
breadcrumb: "mainCrumb",
sidebarLeft: "sidebarLeft",
sidebarRight: "sidebarRight",
footer: "mainFooter"
}
});
然后在定义路由时,我们可以从this.group.options.defaultTemplates
mainAppRoutes.route('/', {
name: "home",
action: function() {
// Get the defaultTemplates object
var templates = this.group.options.defaultTemplates;
// Add route specific templates
templates.content = "homeScreen";
// Pass all the templates to the renderer
BlazeLayout.render("appLayoutMain", templates);
}
});
我喜欢这种模式,因为它使用了Flow Router的现有功能,以及路由中的一行额外代码,同时允许定义组范围内的默认模板。这本质上模仿了Iron Router在Router.config()
中使用模板默认值的方式,并增加了本地路由模板定义不会覆盖整个默认模板对象的好处
- 更新 以上这些对我来说都很好,尽管我最终还是解决了这个问题,使它能够始终如一地工作
route.action
功能中修改任何基础的“路由默认值”,因为Flow Router是非反应性的,只要路由在同一组中,Router group对象似乎会在不同的路由之间持续存在。这个“选项”对象也从路由定义传递给路由器。这意味着,如果在上述情况下覆盖默认参数,则在调用覆盖该参数的路由后,将覆盖使用该组的所有后续路由
我提出的解决方案是在组定义中执行默认值重置函数:triggerseit:[resetDefaults]
然后就是重新设置默认值。我在退出时这样做的原因是,下一个被调用的路由仍然可以在本地覆盖这些默认值:
function resetDefaults (context) {
context.route.group.options.defaultLayoutTemplate = "mainAppLayout";
context.route.group.options.defaultTemplates = {
defaultTeamplates: "navMain",
// ...
};
此外,这允许本地路由定义有选择地覆盖默认模板,而Iron Router不允许有选择地覆盖默认模板。简而言之,要访问嵌套模板中的父级,您可以通过
FlowRouter.current().group.parent.options.defaultTemplates