2014-11-03 37 views
1

我寫了一個插入鏈接的模板助手,相當簡單。如何設置Handlebars模板的默認參數?

Handlebars.registerHelper('link_to', function(href, title) { 
    return new Handlebars.SafeString('<a href="/' + href + '">' + title + '</a>'); 
}); 

而且其用法是,像這樣:

{{ link_to 'articles' 'Articles' }} 

然而,似乎有點多餘,我在第二個參數中指定一個大寫的版本,如果href是自描述的。所以我想自動設置這個行爲,如果標題參數被省略。像下面這樣:

Handlebars.registerHelper('link_to', function(href, title) { 
    if (!title) { 
     title = href.charAt(0).toUpperCase() + href.slice(1); 
    } 
    return new Handlebars.SafeString('<a href="/' + href + '">' + title + '</a>'); 
}); 

然而,當{{ link_to 'articles' }}渲染我只是得到[object Object]。保持第二個參數並不重要,但我只是想知道是否有辦法解決這個問題。

回答

7

Helpers接受一個可選的Hash作爲其最終參數。如果模板不提供散列參數,Handlebars會自動傳遞一個空對象({})。

[從http://handlebarsjs.com/block_helpers.html]

所以,當您有在它被當作哈希對象傭工參數列表的標題。您可以通過在控制檯中記錄標題來檢查。因此,爲了讓代碼正常工作,可以使用typeof運算符來檢查標題的類型是否爲String。

if(!title || typeof title != 'String') { 
    title = href.toString().charAt(0).toUpperCase() + href.slice(1); 
} 

它應該工作。工作示例: http://jsfiddle.net/prabhat_rai/ve4h39vm/

+0

非常感謝您的幫助。 :-) – Ben 2014-11-06 09:24:20

0

使用哈希參數在車把上的正確方法似乎是檢查在options參數(傳遞給任何幫助的最後一個參數)的hash屬性預期的可選參數。

在OP例子,這會是這樣的:

Handlebars.registerHelper('link_to', function(href, options) { 
    var title = options.hash.title || href.toString().charAt(0).toUpperCase() + href.slice(1); 
    return new Handlebars.SafeString('<a href="/' + href + '">' + title + '</a>'); 
}); 

這樣的幫手可以這樣

{{ link_to 'articles' title='Articles' }} 

使用或本

{{ link_to 'articles' }} 

這樣做的好處您可以添加任意數量的可選模板參數,而不僅僅是一個。即上述例子中可以很容易地擴展,以提供可選的工具提示,以及:

Handlebars.registerHelper('link_to', function(href, options) { 
    var title = options.hash.title || href.toString().charAt(0).toUpperCase() + href.slice(1); 
    var tooltip = options.hash.tooltip || title; 
    return new Handlebars.SafeString('<a href="/' + href + '" title="' + tooltip + '">' + title + '</a>'); 
}); 

現在既titletooltip可以指定相互獨立的。即你可以指定一個工具提示,但沒有自定義標題:

{{ link_to 'articles' tooltip='Go to Articles' }}