不可预知的行为把手辅助反向循环

时间:2014-07-20 16:46:36

标签: javascript ember.js handlebars.js

我为把手模板

创建了这个辅助函数
Handlebars.registerHelper('reverse_for', function(from, to, decrease, block) {
    var result = '';
    for(var i = from; i >= to; i -= decrease)
        result += block.fn(i);
    return result;
});

代码似乎在起作用。它有时可以工作,有时不会返回{{this}}的值(在handlebars.js模板中),尽管它在正确的项目数上有正确的输入和循环。

这是我在handlebars.js模板中输出的方法

<div class="form-group">
    <label>Bar Width {{baseComponents.bar.product.max_width}} - {{baseComponents.bar.product.min_width}}</label>
    <select class="form-control csb-bar-width-selector">
        {{#reverse_for baseComponents.bar.product.max_width baseComponents.bar.product.min_width 1}}
            <option value="{{this}}">{{this}} inches</option>
        {{/reverse_for}}
    </select>
</div>

它有时也有效。以下是第一次工作但不是第二次工作的示例。当我重新加载它可能完全或根本不工作。

enter image description here

有时,{{this}}有时会输出正确的值,有时则不会。我认为问题在于辅助函数以及我如何构建结果。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

Handlebars.registerHelper('reverse_for', function(from, to, decrease, options) {
    var result = String('');
    for(var i = parseInt(from); i >= parseInt(to); i -= parseInt(decrease))
    {
        result += String(options.fn({'index':parseInt(i)}));
    }
    return result;
});

似乎没有问题。

在模板中,我现在使用

{{ index }}

而不是

{{ this }}

输出值

parseInt和String转换似乎不会影响辐照结果,但将其作为仅具有索引键的对象返回似乎没有这种奇怪的行为。

答案 1 :(得分:0)

      Handlebars.registerHelper('each_reverse',function (context, options) {
      var fn = options.fn, inverse = options.inverse;
      var length = 0, ret = "", data;

      if (Handlebars.Utils.isFunction(context)) { context = context.call(this); }

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

      if(context && typeof context === 'object') {
        if (Handlebars.Utils.isArray(context)) {
            length=context.length;
          for(var j = context.length-1; j >= 0; j--) {//no i18n
            if (data) {
              data.index = j;
              data.first = (j === 0);
              data.last  = (j === (context.length-1));
            }
            ret = ret + fn(context[j], { data: data });
          }
        } else {
                var keys = Object.keys(context);
                length=keys.length;
                for(j=length; j>=0;j--)
                {
                    var key = keys[j-1]
                    if(context.hasOwnProperty(key)) {
                        if(data) { 
                            data.key = key; 
                            data.value = context[key];
                            data.index = j;
                            data.first = (j === 0);
                          }
                          ret += fn(context[key], {data: data});
                    }
                }
        }
      }

      if(length === 0){
        ret = inverse(this);
      }

      return ret;
    } );