以下更新:
我已经找到了一种我认为相当有效且高效的方法。
在查看 Flow-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 是非反应性的,路由器组对象似乎在路由之间持续存在只要路线在同一组中。这个“选项”对象也从路由定义传递给路由器。所以这意味着如果您在上述情况下覆盖默认参数,那么在调用覆盖它的路由之后,使用同一组的所有后续路由都将覆盖该参数。
我想出的解决方案是在组定义中执行默认重置功能:triggersExit: [ resetDefaults ]。
然后只是重置默认值。我在退出时这样做的原因是,下一个被调用的路由仍然可以在本地覆盖这些默认值:
function resetDefaults (context) {
context.route.group.options.defaultLayoutTemplate = "mainAppLayout";
context.route.group.options.defaultTemplates = {
defaultTeamplates: "navMain",
// ...
};