Javascript 如何设置把手模板的默认参数?

Javascript 如何设置把手模板的默认参数?,javascript,handlebars.js,Javascript,Handlebars.js,我已经编写了一个模板助手,它插入了一个链接,非常简单 Handlebars.registerHelper('link_to', function(href, title) { return new Handlebars.SafeString('<a href="/' + href + '">' + title + '</a>'); }); 但是,如果href是自描述的,那么在第二个参数中指定大写版本似乎有点多余。因此,如果省略title参数,我想自动设置此行为。

我已经编写了一个模板助手,它插入了一个链接,非常简单

Handlebars.registerHelper('link_to', function(href, title) {
    return new Handlebars.SafeString('<a href="/' + href + '">' + title + '</a>');
});
但是,如果href是自描述的,那么在第二个参数中指定大写版本似乎有点多余。因此,如果省略title参数,我想自动设置此行为。如下所示:

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>');
});
handlebar.registerHelper('link_to',函数(href,title){
如果(!标题){
title=href.charAt(0.toUpperCase()+href.slice(1);
}
返回新把手。安全字符串(“”);
});

然而,当使用
{{link_to'articles'}}
呈现时,我只得到
[object object]
。保留第二个参数没什么大不了的,但我只是想知道是否有办法解决这个问题。

帮助程序接受可选哈希作为其最终参数。如果模板不提供哈希参数,Handlebar将自动传递一个空对象({})

[来自]

因此,当您在helpers参数列表中拥有title时,它将被视为哈希对象。您可以通过在控制台中记录标题来检查这一点。因此,要使代码正常工作,只需检查标题的类型是否为String,或者是否使用typeof运算符

if(!title || typeof title != 'String') {
    title = href.toString().charAt(0).toUpperCase() + href.slice(1);
}
它应该会起作用。工作示例:
在Handlebar中使用散列参数的正确方法似乎是检查
选项
参数(作为最后一个参数传递给任何助手)的
散列
属性中的预期可选参数

在OP示例中,如下所示:

Handlebars.registerHelper('link_to', function(href) {
    var options = arguments[arguments.length - 1];
    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' }}
这样做的好处是,您可以添加任意数量的可选模板参数,而不仅仅是一个。也就是说,上面的示例可以轻松扩展,以提供可选的工具提示:

Handlebars.registerHelper('link_to', function(href) {
    var options = arguments[arguments.length - 1];
    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>');
});

修理你的助手。选项对象使这变得很困难。因此,通过使用围绕参数移动的东西包装函数,您可以获得更合理的代码,假设您将有多个具有可选参数的帮助器

function fixHelper(func) {
  return function(){
    var aArgs=Array.prototype.slice.call(arguments, 0)
      ,opts=aArgs.pop();
    aArgs.unshift(opts);
    return func.apply(this, aArgs);
  }

 function link_to(options, href, title) {
    title = title || href.ucfirst()
    return new Handlebars.SafeString('<a href="/' + href + '">' + title + '</a>')
 }
 Handlebars.registerHelper('link_to', fixHelper(link_to))
函数fixHelper(func){
返回函数(){
var aArgs=Array.prototype.slice.call(参数,0)
,opts=aArgs.pop();
aArgs.取消移位(opts);
返回函数应用(本,AARG);
}
功能链接到(选项、href、标题){
title=title | | href.ucfirst()
返回新把手。安全字符串(“”)
}
把手。登记帮助器(“链接到”,固定帮助器(链接到))

当传递第二个参数(作为字符串)时,不确定这是否有效调用
options.hash.title
将失败,因为
无法读取未定义的
@doublejosh的属性'title'。所有可选参数都需要以
=
的方式传递,否则手柄会将
options
参数向右移动并断开辅助对象。当然。我指的是如何检查选项p辅助程序中的参数。由于当存在第二个参数时,
options
可以是字符串,因此引用该嵌套属性会导致错误。@doublejosh要处理任意数量的参数,可以在辅助程序函数中使用
arguments
对象。options对象将始终是
arguments[arguments.length-1]
。我相应地修改了我的答案。这是一个非常好的信息!!!这部分车把没有文档记录。
Handlebars.registerHelper('link_to', function(href) {
    var options = arguments[arguments.length - 1];
    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>');
});
{{ link_to 'articles' tooltip='Go to Articles' }}
function fixHelper(func) {
  return function(){
    var aArgs=Array.prototype.slice.call(arguments, 0)
      ,opts=aArgs.pop();
    aArgs.unshift(opts);
    return func.apply(this, aArgs);
  }

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