2014-07-20 94 views
0

我創造了這個輔助函數了車把模板不可預知的行爲車把幫手反向for循環

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; 
}); 

的代碼似乎工作irradical。它有時可以工作,有時不會返回{{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

再次有時{{此}}輸出值正確,有時它沒有。我認爲問題出現在助手功能中,以及我如何建立結果。任何幫助表示讚賞。

回答

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函數和字符串鑄造似乎並沒有影響到irradical結果,但將它作爲只有索引鍵的對象返回,似乎沒有這種奇怪的行爲。

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; 
    });