车把js扩展算术加法助手

时间:2014-06-25 14:20:37

标签: javascript handlebars.js helper

我写了一个助手来在车把js中添加货币。虽然这适用于两个项目,但如何将其扩展到任意数量的项目?

即,

{{total a b}}

Handlebars.registerHelper("total", function(a,b) {
  return "$"+(Number(a.replace(/[^0-9\.]+/g,"")) + Number(b.replace(/[^0-9\.]+/g,""))).toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');
});

到,n个项目。即,

{{total a b c d}}

如何写一个助手来获得类似的东西?

1 个答案:

答案 0 :(得分:1)

这应该是你要找的东西

Handlebars.registerHelper("total", function(a,b) {    
  var nums = [].slice.call(arguments,0,-1);      
  var sum = nums.reduce(function(prev,next) {
    return prev + Number(next.replace(/[^0-9\.]+/g, ""));
  },0);    
  return "$" + sum.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');
});

您可以使用以下背景和模板

tryhandlebarsjs中对此进行测试
{ 
  "a": "10",
  "b": "20",
  "c": "30",
  "d": "40" 
}

{{total a b c d}}

在帮助程序中,您将有一个额外的options对象以及参数。 options对象是最后一个参数。所以首先我们需要获得一个没有options的传递参数的列表。

arguments是一个可在函数内访问的javascript关键字。它是一个类似于对象的数组,它包含所有传递的参数。由于它没有切片方法,我们使用数组的切片方法。我们在参数(call)的上下文中执行该方法。所以我们使用这一行

var nums = [].slice.call(arguments,0,-1);

在下一行中,我们使用内置的reduce方法循环数组。

其余代码自我解释。