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

时间:2014-07-22 13:46:27

标签: gruntjs handlebars.js assemble

当使用相同的文件名传递给相对模板的数据对象时,我遇到了汇编问题......

首先关闭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 }}

和insurance / index.hbs

{{#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}}

一切正常,但我需要能够使用相同的文件名只是在不同的目录中。

我不知道如何解决这个问题。任何指导都很有用。

一个。

1 个答案:

答案 0 :(得分:0)

我注意到您在示例中的模板中使用index{{#index}}是引用数据文件还是上下文中的变量? (很高兴解释这是否有意义。)

重复名称问题是我们过去曾讨论过的问题,简而言之,很难解决香草部分问题。例如部分中没有逻辑,它们只是使用传递给它们的上下文。至于数据,类似的挑战,它只是一个对象,所以重复的属性不会起作用。

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

使用帮助程序而不是部分

使用帮助器可以实现与partials相同的功能,但您也可以添加一些逻辑来使用一些额外的信息来帮助区分文件(例如,因为basename不够好在这种情况下)。

您可以创建一个帮助程序,根据前面的属性过滤掉文件,或者创建一个帮助程序,允许您使用散列上定义的正则表达式模式测试文件路径。类似的东西(你需要根据你的其他设置进行调整):

{{#test page.dirname 'foo'}}
  {{#index }} 
    {{> hero }}
    {{> shout }}
    {{> social }}
  {{/index }}
{{/test}}

或者,尝试使用帮助程序包装块

或者,您可以尝试使用{{#is}}...{{/is}}帮助程序或其他比较帮助程序,它可以根据其他(条件)信息筛选出部分/文件。 (顺便说一句,你可以在你的比较中使用上下文中的任何属性。它是在前面的物质还是文件路径的一部分是任意的,由你决定)。例如:

{{#is data.slug 'foo'}}
  {{#index }} 
    {{> hero }}
    {{> shout }}
    {{> social }}
  {{/index }}
{{/test}} 

另外,虽然我在我的示例中包含了index块,但如果你使用帮助器,你可能会使用块助手而不是index,但我不是&#39对你的设置了解得足够肯定。希望这有帮助


编辑:请勿执行上述建议。当我早些时候写这篇文章时,我并没有想清楚。上述解决方案不适用于过滤部分内容。对于过滤页面,他们值得考虑。更具体地说,当部分到达助手时,阵列中的部分已经被缩减为基本名称,因此任何"欺骗"在他们到达帮助者之前已经被过滤掉了。

您可以创建一个include帮助程序并将includes属性添加到汇编选项中,其中将定义包含的glob模式,然后在帮助程序中执行一些自定义逻辑以计算路径等但我的建议是创建一个中间件来做你需要的。请参阅汇编i18n middleware,它可能是我能想到的最好的例子,让您开始朝着正确的方向前进。