Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在FlowRouter中定义默认渲染模板的好方法_Javascript_Meteor_Flow Router - Fatal编程技术网

Javascript 在FlowRouter中定义默认渲染模板的好方法

Javascript 在FlowRouter中定义默认渲染模板的好方法,javascript,meteor,flow-router,Javascript,Meteor,Flow Router,当迁移到一个新的Meteor项目,用Flow Router替换Iron Router时,我真的错过了Iron Router定义全球可用的默认行为和设置的功能 我知道Flow Router使用“组”构造来定义默认的钩子事件,这些钩子事件可以应用于连接到该组的任何路由,但是似乎没有任何东西可用于定义默认模板 实现这种默认全局或组模板功能的最佳方法是什么?我决定使用一个简单的抽象,它将允许模拟Iron Router的这种功能。我正在尝试评估这是否是一个合理和可扩展的模式,然后再研究如何在FlowRou

当迁移到一个新的Meteor项目,用Flow Router替换Iron Router时,我真的错过了Iron Router定义全球可用的默认行为和设置的功能

我知道Flow Router使用“组”构造来定义默认的钩子事件,这些钩子事件可以应用于连接到该组的任何路由,但是似乎没有任何东西可用于定义默认模板


实现这种默认全局或组模板功能的最佳方法是什么?

我决定使用一个简单的抽象,它将允许模拟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