backbone.js - Handlebars 获取循环索引

标签 backbone.js handlebars.js handlebarshelper

我有一个用backbone和handlebars编写的助手,我需要获取内部for循环的索引。

这是我的 helper

 Handlebars.registerHelper('for', function(from, to, incr, block) {
        var accum = '';
        for(var i = from; i < to; i += incr)
            accum += block.fn(i);
        return accum;
    });

这是我的模板:

{{#each rows}}
    <div class="row">
        {{#for 0 10 1}}
            <div class="edit-column" data-id="{{@index}}">
            </div>
        {{/for}}
    </div>
{{/each}}

我喜欢 {{@index}} 打印 for 循环的索引,现在它打印 {{#each rows}} 循环的计数器

如何获取for循环的索引?

最佳答案

您正在寻找inject private variables进入您的模板:

Block helpers can also inject private variables into their child templates. This can be useful to add extra information that is not in the original context data.

For example, when iterating over a list, you may provide the current index as a private variable.

您只需在传递给 block 函数的选项中提供数据条目(并确保子数据对象与 Handlebars.createFrame 的一致性)

修改后的助手公开 @index 键:

Handlebars.registerHelper('for', function(from, to, incr, block) {
    var data;

    if (block.data) {
        data = Handlebars.createFrame(block.data);
    }

    var accum = '';
    for(var i = from; i < to; i += incr) {
        if (data) {
          data.index = i;
        }
        accum += block.fn(i, {data: data});
    }
    return accum;
});

和演示

Handlebars.registerHelper('for', function(from, to, incr, block) {
    var data;

    if (block.data) {
        data = Handlebars.createFrame(block.data);
    }


    var accum = '';
    for(var i = from; i < to; i += incr) {
        if (data) {
          data.index = i;
        }
        accum += block.fn(i, {data: data});
    }
    return accum;
});

var tpl = Handlebars.compile($('#rows').html());
$('body').append(tpl({
    rows: [1, 2]
}));
.edit-column {padding-left: 10px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.5/handlebars.min.js"></script>

<script type='text/template' id='rows'>
{{#each rows}}
    <div class="row">{{@index}}
        {{#for 0 3 1}}
            <div class="edit-column">{{@../index}}:{{@index}}</div>
        {{/for}}
    </div>
{{/each}}
</script>

关于backbone.js - Handlebars 获取循环索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39785392/

相关文章:

javascript - 将集合而不是数组传递给 fetch().then() 回调

javascript - 将 Collection View 绑定(bind)到另一个 View

请求中的 Javascript、BackboneJS、oData 单引号

javascript - 在 Jade 中渲染下划线变量

ember.js - 每当 {{input}} Ember Handlebars 帮助器的值发生变化时调用 Controller 方法

node.js - 使用express-handlebars中的助手返回HTML格式的代码

javascript - 从 Meteor js 中的 2 个模板获取输入值

laravel - 如何更改 Handlebars.js 的默认分隔符?

node.js - 如何在 Handlebars View 中连接字符串

javascript - 在 Handlebars 助手中接受多个参数