我有一组对象,我试图使用bootstrap面板在类别中显示。为了获得数组中的所有不同类别,我创建了一个循环数组的助手,并返回一个包含所有不同不同类别的字符串数组。
以下是我的两位助手:
Handlebars.registerHelper("GetFamilies", function (array) {
var families = [];
for (var i = 0; i < array.length; i++) {
var item = array[i];
if (families.indexOf(item.Family) <= -1) {
families.push(item.Family);
}
}
console.log("====================Families");
console.log(families);
return families;
});
Handlebars.registerHelper("GetFamiliyPieces", function (array, familyName) {
var result = _.filter(array, function (obj) {
// return true for every valid entry!
return obj.Family == familyName;
});
console.log("====================Family Pieces");
console.log(result);
return result;
});
这是html:
<div class="panel-group" id="toolbox-accordion">
{{#GetFamilies pieces}}
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a class="accordion-toggle" data-toggle="collapse" data-parent="#toolbox-accordion" href="#{{this}}">
{{this}}
</a>
</h4>
</div>
<div id="{{this}}" class="panel-collapse collapse in">
<div class="panel-body">
{{#GetFamilyPieces pieces this}}
<div class="toolbox_item" data-type="{{TypeName}}" data-type-id="{{TypeID}}" title="{{TypeDescription}}" data-input-count="{{Length Inputs}}" data-output-count="{{Length Outputs}}">
<span id="line"></span>
<div class='typename'>{{ShortName TypeName}}</div>
</div>
{{/GetFamilyPieces}}
</div>
</div>
</div>
{{/GetFamilies}}
</div>
在控制台中,我正在点击GetFamilies Helper:
但没有点击GetFamilyPieces助手。
我呈现的HTML如下所示:
<div id="toolbox-container">
<div class="panel-group" id="toolbox-accordion">
Circuit,Component,Conductor </div>
</div>
正如您所看到的,它只是呈现数组所包含的逗号分隔字符串。你知道为什么没有渲染完整的HTML吗?
答案 0 :(得分:4)
您将获得以逗号分隔的字符串,因为这是JavaScript中的数组为.toStringed时的结果。
来自MDN:
对于Array对象,toString方法连接数组并返回一个 包含用逗号分隔的每个数组元素的字符串。
这意味着["Circuit", "Component", "Conductor"].toString()
会产生"Circuit,Component,Conductor"
。
在调用助手后未呈现模板的其余部分的原因是因为您的助手未正确写入。您的Block Helper应该返回一个包含要呈现的HTML的字符串。因为助手返回一个数组,所以呈现该数组的toString()
。为了访问Block Helper的内部模板,Handlebars提供了一个函数options.fn
,您可以向其传递上下文数据对象。您的助手必须将数组参数中的每个项目传递给options.fn
函数并加入结果。工作实现如下所示:
Handlebars.registerHelper("GetFamilies", function (array, options) {
return array
.reduce((memo, el) => {
if (memo.indexOf(el.Family) === -1) {
memo.push(el.Family);
}
return memo;
}, [])
.reduce((memo, family) => memo += options.fn(family), '');
});
Handlebars.registerHelper("GetFamilyPieces", function (array, familyName, options) {
return array
.filter(el => el.Family === familyName)
.reduce((memo, el) => memo += options.fn(el), '');
});
请注意,在#GetFamilies
Block Helper中,pieces
并不一定存在于您的上下文数据中。您必须告诉Handlebars要升级上下文框架,以查找路径为pieces
的{{1}}。
另一种解决方案,并且,通过您的助手来判断您的目标是使用标准(非阻止)Handlebars Helper。这将允许您像往常一样从助手返回数组,然后将结果数组传递给现有的../pieces
Block Helper。您的模板需要更改为以下内容:
#each