gpt4 book ai didi

javascript - Handlebars Helper 返回数组但呈现逗号分隔的字符串

转载 作者:太空宇宙 更新时间:2023-11-04 02:57:02 25 4
gpt4 key购买 nike

我有一组对象,我试图使用引导面板按类别显示它们。为了获取数组中的所有不同类别,我创建了一个助手,它循环遍历数组并返回一个包含所有不同不同类别的字符串数组。

这是我的两个助手:

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:

enter image description here

但没有点击 GetFamilyPieces 帮助器。

我渲染的 HTML 看起来像这样:

<div id="toolbox-container">

<div class="panel-group" id="toolbox-accordion">
Circuit,Component,Conductor </div>


</div>

正如您所看到的,它只是渲染数组包含的内容的逗号分隔字符串。你知道为什么完整的 html 没有被渲染吗?

最佳答案

您得到的是逗号分隔的字符串,因为这是 JavaScript 中的数组为 .toStringed 时的结果。

来自MDN :

For Array objects, the toString method joins the array and returns one string containing each array element separated by commas.

这意味着 ["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 逐步进入上下文框架以查找路径为 ../piecespieces

另一种解决方案,并且根据您的助手的判断,您的目标似乎是使用标准(非 block )Handlebars Helper 。这将允许您像您所做的那样从助手返回数组,然后将结果数组传递给现有的#each block 助手。您的模板需要更改为以下内容:

{{#each (GetFamilies pieces)}}
{{#each (GetFamilyPieces ../pieces this)}}

{{/each}}
{{/each}}

关于javascript - Handlebars Helper 返回数组但呈现逗号分隔的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39536479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com