Gruntjs 在汇编中使用相同的文件名会导致编译的静态模板出错

Gruntjs 在汇编中使用相同的文件名会导致编译的静态模板出错,gruntjs,handlebars.js,assemble,Gruntjs,Handlebars.js,Assemble,当使用相同的文件名将数据对象传递到相关模板时,我在汇编方面遇到了一些问题 首先是grunt片段: assemble: { options: { layout: "src/responsive/layouts/default.hbs", partials: 'src/responsive/modules/**/*.hbs', data: 'src/responsive/data/**/*.json',

当使用相同的文件名将数据对象传递到相关模板时,我在汇编方面遇到了一些问题

首先是grunt片段:

 assemble: {
        options: {
          layout: "src/responsive/layouts/default.hbs",
          partials: 'src/responsive/modules/**/*.hbs',
          data: 'src/responsive/data/**/*.json',
          flatten: false,
        },
        pages: {
          expand: true,
          cwd: 'src/responsive/pages',
          src: '**/*.hbs',
          dest: 'src/'
        }
}
在我的页面文件夹中,我有index.hbs

{{#index }} 
  {{> hero }}
  {{> rp }}
  {{> feature }}
  {{> social }}
{{/index }}
和保险/指数.hbs

{{#index }} 
  {{> hero }}
  {{> rp }}
  {{> feature }}
  {{> social }}
{{/index }}
{{#index }} 
  {{> hero }}
  {{> shout }}
  {{> social }}
{{/index }}
数据文件夹的结构如下所示:

-responsive
--data
---index.json
---insurance
----index.json
基本上,我每页有一个json,希望json文件与模板匹配。但是,由于它们都被称为“索引”,因此模板使用的数据来自错误的文件。如果我将
insurance/index.hbs
重命名为
insurance/foo.hbs
,并使用
insurance/foo.json
,如下所示:

{{#foo}} 
  {{> hero }}
  {{> shout }}
  {{> social }}
{{/foo}}
这一切都很好,但我需要有能力使用相同的文件名只是在不同的目录

我不知道如何解决这个问题。任何指导都是值得赞赏的


A.

我注意到您在示例中的模板中使用了
索引。
{{{#index}}
引用的是数据文件还是上下文中的变量?(如果这不合理,很乐意解释)

重复名称问题是我们在过去讨论过的问题,简而言之,用普通的部分来解决这个问题是很困难的。e、 partials中没有逻辑,它们只使用传递给它们的上下文。至于数据,类似的挑战是,它只是一个对象,所以重复属性将不起作用

以下是两种可能的解决方案:

使用助手而不是分部词 使用helpers,您可以实现与partials相同的功能,但是您还可以添加一些逻辑,使用一些附加信息来帮助区分文件(例如,在这种情况下,因为basename不够好)

您可以创建一个帮助器,根据前面的属性筛选出文件,或者创建一个帮助器,允许您使用散列中定义的正则表达式模式测试文件路径。类似于(您需要根据其余设置进行调整):

或者,尝试使用辅助对象包装块 或者,您可以尝试使用
{{{is}}…{{/is}
帮助程序或另一个可以根据附加(条件)信息筛选出部分/文件的比较帮助程序。(顺便说一句,您可以在比较中使用上下文中的任何属性。它是在前面还是文件路径的一部分是任意的,由您决定)。例如:

{{#is data.slug 'foo'}}
  {{#index }} 
    {{> hero }}
    {{> shout }}
    {{> social }}
  {{/index }}
{{/test}} 
另外,尽管我在示例中包装了
索引
块,但如果您使用helpers,您可能会使用块helper而不是
索引
,但我对您的设置了解不够,无法确定。希望这有帮助


编辑:不要执行上述建议。我之前写这篇文章的时候没有想清楚。上述解决方案不适用于过滤分部。对于过滤页面,它们值得考虑。更具体地说,当一个部分到达helpers时,数组中的部分将已经减少为一个basename,因此任何“dupe”都将在到达helpers之前被过滤掉

您可以创建一个
include
helper,并将
includes
属性添加到将定义includes的全局模式的汇编选项中,然后在helper中执行一些自定义逻辑以找出路径等。但我的建议是创建一个中间件来完成您需要的操作。看Assembly的,这可能是我能想到的最好的例子,让你朝着正确的方向开始