Templates handlebar.js:嵌套模板带“;“安全”;HTML

Templates handlebar.js:嵌套模板带“;“安全”;HTML,templates,handlebars.js,Templates,Handlebars.js,我试图使用一系列嵌套的Handlebar模板呈现一组高度可变的数据,结果完全去掉了HTML标记,尽管使用了“三重隐藏”并返回了一个SafeString 我的数据类似于: { “类型”:“人”, “详情”:[ {“name”:“firstname”,“value”:“joe”}, {“name”:“lastname”,“value”:“smith”}, { “名称”:“公司”, “价值”:“极致”, “详情”:[ {“name”:“address”,“value”:“123 Main St;某处,

我试图使用一系列嵌套的Handlebar模板呈现一组高度可变的数据,结果完全去掉了HTML标记,尽管使用了“三重隐藏”并返回了一个SafeString

我的数据类似于:

{
“类型”:“人”,
“详情”:[
{“name”:“firstname”,“value”:“joe”},
{“name”:“lastname”,“value”:“smith”},
{
“名称”:“公司”,
“价值”:“极致”,
“详情”:[
{“name”:“address”,“value”:“123 Main St;某处,CA”},
{“姓名”:“员工”,“价值”:“10+”}
]
}
]
}
我有两个这样的模板:


    {{{renderPersonDetails}}}
{{{renderCompanyDetails}}}
我将整个对象传递到第一个模板中。在模板中,我将“details”集合传递给注册的助手:“renderPersonDetails”。 前两个元素很简单,并作为两个LI元素返回。这些很好

当我们点击具有“details”属性的第三个元素时,我将这个对象传递给companyDetails模板,该模板将把“details”集合传递给renderCompanyDetails助手

renderCompanyDetails帮助程序的结果完全脱离HTML,即使:
1.我们正在使用三重存储
2.我们正在返回handlebar.SafeString对象中的内容
3.如果我在返回之前将html输出到控制台,我会看到预期的html

显然这个例子可以大大简化。然而,由于数据的性质和呈现要求,我们的用例需要这种类型的处理


顺便说一句,renderCompanyDetails帮助程序在帮助程序中构造HTML。如果我尝试将数据从帮助程序传递到第三个模板,并返回该模板,HTML甚至在我呈现它之前就被完全剥离了…

您没有显示
renderPersonDetails
的源代码,但我敢打赌它只是返回一个字符串,而不是
Handlebar.SafeString

示例实现--与此相反:

Handlebars.registerHelper('renderPersonDetails', function(data){
  var output = ...;

  return output;
});
这样做:

Handlebars.registerHelper('renderPersonDetails', function(data){
  var output = ...;

  return new Handlebars.SafeString(output);
});

您不希望
  • 标记驻留在模板中吗?在助手中连接一个HTML字符串并没有达到创建模板的目的,不是吗?顺便问一下,您可以在JSFIDLE上做一个演示吗?另外,你能发布助手函数的代码吗?嗨。是的,我想这个例子过于简单化了。companyDetails模板实际上呈现了您可以猜到的列表项。我没有在模板中使用“#each”,因为有些元素的数据依赖于其他元素。我将尝试在JSFIDLE上运行一些东西。以前从未使用过:)当我没有正确地将模板包装到脚本中时,我偶然发现了这种“正在消失”的html。。。已删除错位的DOM元素,如和不在中等。