Handlebars.js 在数据标签中嵌入文字 json 对象

Handlebars.js embed literal json object in data tag

我最近开始使用 Handlebars.js,到目前为止我非常喜欢它!

在我当前的项目中,我在 data 属性中存储了一堆文字值。我想知道是否有办法将完整的 JSON 对象存储在标签中供以后使用。

当前

    {{#each this}}
        <tr data-id="{{Id}}"
            data-prod-code="{{ProductCode1}}"
            data-gague="{{Gague}}"
            data-rvalue="{{RValue}}"
            data-density="{{Density}}"
            data-fhaclass="{{FHAClass}}"
            data-yards="{{Yards}}"
            data-netting="{{Netting}}"
            data-film="{{Film}}"
            data-compressed="{{Compressed}}"
            data-color="{{Color}}"
            data-cfd="{{CFD}}"
            data-elongation="{{Elongation}}"
            data-tensilestrength="{{TensileStrength}}"
            data-compressionset="{{CompressionSet}}"
            data-title="{{Title}}">
                <td>{{ProductCode1}}</td>
                <td>{{Title}}</td>
                <td>{{Gague}}</td>
        </tr>
    {{/each}}

需要

    {{#each this}}
        <tr data-id="{{Id}}"
            data-object="{{FULL JSON for current object in iteration}}">
                <td>{{ProductCode1}}</td>
                <td>{{Title}}</td>
                <td>{{Gague}}</td>
        </tr>
    {{/each}}

以防万一它是相关的...

数据从 MVC4 操作返回并从 $.get() 请求调用。

我想这样做的原因是我可以使用单独的 Handlebars 模板,而无需从 data 属性重建数据。

在此处的另一个 post 中,他们建议使用 jQuery 将数据存储在其内部 K、V 对中。除非它有一些我不知道的邪恶清理能力,否则我将避免这种情况,这样它的内存使用率就不会飙升。存储在 data 属性中的数据会根据搜索词频繁换出,因此我不希望它存储在 jQuery 对象中(除非这是 100% 毫无根据的担忧)。

解决方案:

我最终需要制作一个 Handlebars 助手。

Handlebars.registerHelper('getObjectJSON', function() {
    return JSON.stringify(this);
});

然后我的 Handlebars 模板看起来像这样...

<script id="product-row-template" type="text/x-handlebars-template">​
    {{#each this}}
        <tr data-id="{{Id}}"
            data-title="{{Title}}"
            data-productcode1="{{ProductCode1}}"
            data-object='{{getObjectJSON}}'>
                <td class="addProductToCart">{{ProductCode1}}</td>
                <td class="addProductToCart">{{Title}}</td>
                <td class="addProductToCart">{{Gague}}</td>
                <td class="viewProductDetail" style="width: 5%"><span class="glyphicon glyphicon-search" aria-hidden="true"></span></td>
        </tr>
    {{/each}}
</script>

这让我可以将该数据对象传递给其他 Handlebars 模板,以便在 modals/etc...

中使用
$("#modalBodyAndFooter").html(marketingModalTemplate($(this).closest("tr").data("object")));