2017-08-08 28 views
0

现在,我不是指为他们的孩子传递不同背景的帮助者。不,我的意思是帮助者修改他们作为副作用传递的上下文。Handlebars助手是否允许编辑其上下文?

例和用例:

Handlebars.registerHelper('sortByFoo', function(elts) { 
 
    elts.sort((elt1, elt2) => elt1.foo.localeCompare(elt2.foo)); 
 
    return ""; 
 
}) 
 

 
Handlebars.registerHelper('sortByBar', function(elts) { 
 
    elts.sort((elt1, elt2) => (elt1.bar - elt2.bar)); 
 
    return ""; 
 
}) 
 

 
var context = {elements: [ 
 
    {foo: 'asdf', bar: 5}, 
 
    {foo: 'jkl', bar: 4} 
 
]} 
 

 
var source = document.getElementById('template').innerHTML; 
 
var template = Handlebars.compile(source); 
 

 
document.getElementById('result').innerHTML = template(context);
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.10/handlebars.js"></script> 
 
<script id="template" type="text/x-handlebars-template"> 
 
    {{sortByFoo elements}} 
 
    <h2>Elements sorted by Foo:</h2> 
 
    <ul> 
 
     {{#each elements}} 
 
    \t   <li>{{foo}}, {{bar}}</li> 
 
     {{/each}} 
 
    </ul> 
 
    {{sortByBar elements}} 
 
    <h2>Elements sorted by Bar:</h2> 
 
    <ul> 
 
     {{#each elements}} 
 
    \t   <li>{{foo}}, {{bar}}</li> 
 
     {{/each}} 
 
    </ul> 
 
</script> 
 

 
<div id="result"></div>

只可在把手这种东西?它似乎在这个片段中有效,但是... Handlebars文档详细介绍了将各种上下文传递给子元素的各种方式,但没有说明帮助者能够修改自己的上下文,这让我想到了什么我正在做的或许不是车把的预期用法,如果它起作用,它只会偶然发生 - 也许如果我不想立即遇到麻烦,我应该停止这样做。

这样的东西是否允许在把手上?

+1

肯定这是允许的。它只是使用JavaScript - 你可以做任何你想要的。有没有更好的办法?大概。为什么你不需要帮助人员对列表进行排序和渲染? –

+0

@realseanp我将如何参考'each'中的助手返回的列表? – gaazkam

+0

顺便说一句,你不修改上下文,你改变它。突变通常不会阻止,我认为使用它并没有问题,而突变本身通常不是一种好的做法。 –

回答

1

这可能工作。我只是每个助手都带上了hbs,但是添加了你在助手中的排序功能。

Handlebars.registerHelper('eachSorted', function(context, options) { 
    var ret = ""; 
    var arr = context.slice(); 
    arr.sort((elt1, elt2) => elt1.foo.localeCompare(elt2.foo)); 

    for(var i = 0; i < arr.length; i++) { 
    ret = ret + options.fn(arr[i]); 
    } 

    return ret; 
}); 

然后

{{#eachSorted elements}} 
     <li>{{foo}}, {{bar}}</li> 
    {{/each}} 
+0

问题是,自从'arr.sort'将数组排序后,它与我的片段有什么不同? – gaazkam

+1

'var arr = context.slice();'创建一个新的数组 –

相关问题