2013-02-12 47 views
1

我的问题是如何访问模板中的参数“style”和“content”?我通过创建另一个帮助者来修改帮助者(基础与在官方网站上),但我无法访问它们。帮手修改每个在句柄中的行为JSON

模板

<div id=emoticons class="change_profile"> 
    {{#each all_avatars.images_male}}//this is an array['m1', 'm2, ...]' 
     <img src="domain.com/{{this.content}}.png" style="{{this.style}}"> 
    {{/each}} 
</div>     

助手

<script> 
    Handlebars.registerHelper('each', function(icons_list) { 
     var icons=[]; 
     var single={ 
      content:'', 
      style:'' 
     }  
     for(var i=0, j=icons_list.length; i<j; i++) { 
        single.content = icons_list[i]; 
        single.style='<something>';    
        icons[i]=single; 
      }  
      return icons; 
     }); 
</script>  

结果

<div id=emoticons class="change_profile"> 

[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]        

</div> 

回答

2

基于Handlebars.js文档(请参阅Simple Iterators),您的帮助器应该返回一个直接呈现到文档中的字符串。当您返回一个数组(icons)时,它将转换为字符串并按原样呈现。

下面的帮助者声明应该给出更好的结果,特别是考虑到调用options.fn(single)应该让Handlebars.js将模板img转换为适当的图像。

<script> 
    Handlebars.registerHelper('each', function(icons_list, options) { 
     var icons=""; 
     var single={ content:'', style:'' }; 

     for(var i=0, j=icons_list.length; i<j; i++) { 
      single.content = icons_list[i]; 
      single.style='<something>';    
      icons += options.fn(single); 
     }  
     return icons; 
    }); 
</script> 

话虽这么说,这不是把这种逻辑到一个名为each帮手,能迅速变得混乱是一个好主意。我宁愿使用相同的each的一个文件中声明并更换模板:

<div id=emoticons class="change_profile"> 
    {{#each all_avatars.images_male}} 
     <img src="domain.com/{{this}}.png" style="<something>"> 
    {{/each}} 
</div> 
+0

好吧,我这样做,真的是工作没有问题,完善。我现在的问题是,如何返回另一个不同情况下的对象数组?我不想在帮助器中完全构建html内容 – francis 2013-02-12 13:43:36

+1

在帮助器中返回数组不成问题。但是,您可以将您的转换代码声明为正常的JavaScript函数,并使用它将数组转换为另一个。我不确定是否以内联方式调用它(例如,'{{#each convert(all_avatars.images_male)}}')将会起作用。 – ybo 2013-02-12 13:55:54