2013-07-30 32 views
13

下面是一个典型的手把助手之间的区别:如何将参数传递给Handlebars helper?什么是options.hash&options.data

Ember.Handlebars.helper 'myHelper', (value, options) -> 
    ... 

根据this protip你可以通过散列手把帮手。我查看了源代码,发现它提供了options.hashoptions.data。我预期有点糊涂,因为这是行不通的:

{{#with controllers.currentCardCategory}} 
    {{#each property in cardProperties}} 
    <td class="td">{{cardProperty this property=property.symbol}}</td> 
    {{/each}} 
{{/with}} 

this是当前Card记录。在这里,我得到了property.symbol作为字符串

但是这工作:

{{#with controllers.currentCardCategory}} 
    {{#each property in cardProperties}} 
    <td class="td">{{cardProperty this property.symbol}}</td> 
    {{/each}} 
{{/with}} 

和值通过options是访问。

但现在我不能做到这一点:

{{#with controllers.currentCardCategory}} 
    {{#each property in cardProperties}} 
    <td class="td">{{cardProperty this property.symbol anotherParam yetAnotherParam}}</td> 
    {{/each}} 
{{/with}} 

我的问题是:如何将其他参数传递给助手什么在助手options.hashoptions.data之间的区别?

回答

14

传递给帮助者的参数变成帮助者函数的arguments。您在{{helperName之后立即在模板中提供的值成为参数。传递给帮助者的最后一个参数是一个options对象,它向帮助者提供附加信息,如options.hashoptions.contexts等。参数后提供的键值对与options.hash属性相对应。

对于hello帮手接受3个参数,助手会,

Ember.Handlebars.helper('hello', function(a, b, c, options) { 
    return '%@ - %@ - %@'.fmt(a, b, c); 
}); 

hello助手可以在像这样的模板使用,

{{hello lorem ipsum dolor}} 

这里的lorem值, ipsumdolor属性将被使用并作为组合字符串返回。

除了所需的参数之外,如果您传入其他参数,它们将在options.hash中可用。这些属性被视为字符串,并且默认情况下不会解析。您需要先使用options.data.view来查找它们的值。如果需要执行此操作,请参阅此answer的示例。

最后options.data是提供给助手的特殊属性。原始句柄Frame包含变量,上下文等。它主要用于块助手。由于块助手不会自己渲染,而是调用其他助手,因此options.data允许此类助手将其他变量注入到子助手框架中。详情请参阅文档here

这里是一个jsbin的例子。