2016-06-09 48 views
0

我们使用config.json来设置基于Handlebars的布局以从模板生成电子邮件。该json配置包含部分名称和该部分的内容(图像,标题和说明)。使用JSON定义Handlebars JS partials:在JSON中定义部分的名称,并使Handlebars JS呈现部分

/分音/ ..分别称为:

  • primary.html
  • secondary.html

此处是/data/config.json一个例子 - 您可以看到“模块”节点包含部分及其内容:

{ 
    "subject": "my email subject", 
    "pretext": "this is the pretext text", 
    "modules": { 
     "primary":{ 
      "image": { 
       "src": "primary-hero.jpg", 
       "alt": "This is the primary image" 
      }, 
      "headline": "Primary Headline", 
      "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cupiditate nulla ipsam ratione rem incidunt quasi quos, possimus cumque neque corporis, dignissimos deserunt perspiciatis totam. Totam itaque distinctio deserunt fugiat nostrum." 
      }, 
     "secondary":{ 
      "image": { 
       "src": "secondary-hero.jpg", 
       "alt": "This is the secondary hero image" 
      }, 
      "headline": "Secondary Headline", 
      "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cupiditate nulla ipsam ratione rem incidunt quasi quos, possimus cumque neque corporis, dignissimos deserunt perspiciatis totam. Totam itaque distinctio deserunt fugiat nostrum." 
      }, 
    } 
} 

我目前有一个句柄循环/pages/index.html工作,但使用比较帮手。显然,这种做法有问题,因为它迫使任意渲染顺序,还可以当部分在JSON反复失败:

{{#each config.modules}} 
    {{#ifEqual @key "primary"}} 
    {{> primary}} 
    {{/ifEqual}} 
    {{#ifEqual @key "secondary"}} 
    {{> secondary}} 
    {{/ifEqual}} 
{{/each}} 

更理想的是,循环应该是这样的:

{{#each config.modules}} 
    {{ > @key }} 
{{/each}} 

那当然失败:

Panini: rendering error ocurred. 
{ [Error: The partial @key could not be found] 
    description: undefined, 
    fileName: undefined, 
    lineNumber: undefined, 
    message: 'The partial @key could not be found', 
    name: 'Error', 
    number: undefined } 

有没有什么办法做到这一点 - 通过json传递部分名称?

回答

0

我不是很熟悉的手把,所以有可能是一个更好的办法,但我想出了这个:

Handlebars.registerHelper('renderPartial', (key) => key); 

要使用:

{{#each config.modules}} 
    {{> (renderPartial @key) }} 
{{/each}} 
+0

不是一个坏想法。但是,这只会导致@键值是输出,而Handelbars不会实际呈现部分。它目前在我的模板中显示以下文本:主证书 –

+0

@christian_pn请参见[this gist](https://gist.github.com/robertklep/5b69e35add4f5b5f121d344e2986769d)了解独立示例。也许我误解了你想达到的目标? ('handlebars @ 4.0.5') – robertklep

0

我已经算起来基于此线程:https://github.com/ericf/express-handlebars/issues/121

“子表达式不解决变量,所以[名称]必须是一个函数。”

我创建了一个助手,简单地返回一个字符串:

getPartial

module.exports = function(name) { 
    return name; 
}; 

在车把上渲染循环:

{{#each config.modules}} 
    {{> (getPartial @key) }} 
{{/each}} 

现在呈现没有错误。但是,在JSON中重复部分时,它似乎仍然存在问题,它只会呈现该部分的单个实例。

所以,虽然“二次”在JSON中包含了两次,它只能呈现部分一次:

{ 
    "subject": "my email subject", 
    "pretext": "this is the pretext text", 
    "modules": { 
     "primary":{ 
      "image": { 
       "src": "primary-hero.jpg", 
       "alt": "This is the primary image" 
      }, 
      "headline": "Primary Headline", 
      "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cupiditate nulla ipsam ratione rem incidunt quasi quos, possimus cumque neque corporis, dignissimos deserunt perspiciatis totam. Totam itaque distinctio deserunt fugiat nostrum." 
      }, 
     "secondary":{ 
      "image": { 
       "src": "secondary-hero.jpg", 
       "alt": "This is the secondary hero image" 
      }, 
      "headline": "Secondary Headline", 
      "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cupiditate nulla ipsam ratione rem incidunt quasi quos, possimus cumque neque corporis, dignissimos deserunt perspiciatis totam. Totam itaque distinctio deserunt fugiat nostrum." 
      }, 
     "secondary":{ 
      "image": { 
       "src": "secondary-hero.jpg", 
       "alt": "This is the secondary hero image" 
      }, 
      "headline": "Secondary Headline", 
      "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cupiditate nulla ipsam ratione rem incidunt quasi quos, possimus cumque neque corporis, dignissimos deserunt perspiciatis totam. Totam itaque distinctio deserunt fugiat nostrum." 
      }, 
    } 
} 

这必须直接相关的事实,渲染列表是一个循环和@密钥必须是唯一的?如果我直接列出部分,它会呈现“次要”预期的两倍:

{{> primary}} 
{{> secondary}} 
{{> secondary}} 
+0

这正是我的回答所做的(除了它看起来像忘记提及您使用'express-handleb'而不是普通的'handlebars'模块)。另外,当你添加一个键到一个已经存在的对象时,你将不能拥有一个拥有相同键的对象,它只会覆盖前一个键。 – robertklep