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

标签 javascript node.js handlebars.js

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

这是我的两个助手:

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/

相关文章:

node.js - TypeScript 或 CoffeeScript

javascript - SolidJS - 如何获取当前组件实例

jquery - 公式居中模态

javascript - 将 JSON 对象重新映射到其他 JSON 结构

node.js - AES256密码和iv,正确的方法

javascript - Ember 2.0 中的 makeBoundHelper 替代方案

twitter-bootstrap - 变形在 Ember.js View 中弄乱 CSS

haml - Handlebars 阻止助手在 HAML 中搞砸了

javascript - 当必须首先在服务器上生成图像时,将图像异步预加载到浏览器缓存中

javascript - 使用 Node.js(watson-developer-cloud 模块)发送 AlchemyData News 查询