1

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

首先是咕噜声片段:

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

和保险/index.hbs

{{#index }} 
  {{> hero }}
  {{> shout }}
  {{> social }}
{{/index }}

数据文件夹的结构如下:

-responsive
--data
---index.json
---insurance
----index.json

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

{{#foo}} 
  {{> hero }}
  {{> shout }}
  {{> social }}
{{/foo}}

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

我不知道如何解决这个问题。任何指导都非常适用。

一个。

4

1 回答 1

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,但我对您的设置了解不多,无法确定。希望这可以帮助


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

您可以创建一个include助手并将一个includes属性添加到将定义包含的 glob 模式的 assemble 选项中,然后在助手中执行一些自定义逻辑以找出路径等。但我的建议是创建一个中间件来执行您的操作需要。请参阅 Assemble 的i18n 中间件,这可能是我能想到的最好的示例,可以让您朝着正确的方向开始。

于 2014-07-23T13:34:27.043 回答