我已经开始使用mustache.js,到目前为止我印象非常深刻。虽然有两件事让我困惑。第一个引导到第二个跟我一起承担。
我的JSON
{"goalsCollection": [
{
"Id": "d5dce10e-513c-449d-8e34-8fe771fa464a",
"Description": "Multum",
"TargetAmount": 2935.9,
"TargetDate": "/Date(1558998000000)/"
},
{
"Id": "eac65501-21f5-f831-fb07-dcfead50d1d9",
"Description": "quad nomen",
"TargetAmount": 6976.12,
"TargetDate": "/Date(1606953600000)/"
}
]};
我的处理功能
function renderInvestmentGoals(collection) {
var tpl = '{{#goalsCollection}}<tr><td>{{Description}}</td><td>{{TargetAmount}}</td><td>{{TargetDate}}</td></tr>{{/goalsCollection}}';
$('#tblGoals tbody').html('').html(Mustache.to_html(tpl, collection));
}
Q1 你可以看到我的'TargetDate'需要解析,但我不确定如何在我当前的函数中做到这一点。
Q2 假设我想在渲染之前对我的一个或多个对象执行某些功能或格式化,这样做的最佳方式是什么?
答案 0 :(得分:19)
您可以使用"lambda"
"TargetDate": "/Date(1606953600000)/",
"FormatDate": function() {
return function(rawDate) {
return rawDate.toString();
}
}, ...
然后在标记中:
<td>
{{#FormatDate}}
{{TargetDate}}
{{/FormatDate}}
</td>
从链接:
当值是可调用对象(例如函数或lambda)时,将调用该对象并传递文本块。传递的文本是文本块,未经渲染。
答案 1 :(得分:9)
我为Mustache.js创建了一个小扩展,它允许在表达式中使用格式化程序,例如{{expression |格式化}}
您无论如何都需要创建一个解析日期值的函数,如下所示:
Mustache.Formatters = {
date: function( str) {
var dt = new Date( parseInt( str.substr(6, str.length-8), 10));
return (dt.getDate() + "/" + (dt.getMonth() + 1) + "/" + dt.getFullYear());
}
};
然后只需将格式化程序添加到表达式中:
{{TargetDate | date}}
您可以从此处获取代码:http://jvitela.github.io/mustache-wax/
答案 2 :(得分:6)
很久以前,但是在寻找完全相同的事情。 Mustachejs(现在)允许您调用传递数据的函数,而不仅仅是那个;在函数中,this
的值是一个部分中的任何值。
如果我的模板是这样的:
{{#names}}
<p>Name is:{{name}}</p>
<!-- Comment will be removed by compileTemplates.sh
#lastLogin is an if statement if lastLogin it'll do this
^lastLogin will execute if there is not lastLogin
-->
{{#lastLogin}}
<!--
formatLogin is a method to format last Login
the function has to be part of the data sent
to the template
-->
<p>Last Login:{{formatLogin}}</p>
{{/lastLogin}}
{{^lastLogin}}
not logged in yet
{{/lastLogin}}
{{#name}}
passing name to it now:{{formatLogin}}
{{/name}}
{{/names}}
和这样的数据:
var data={
names:[
{name:"Willy",lastLogin:new Date()}
],
formatLogin:function(){
//this is the lastDate used or name based on the block
//{{#name}}{{formatLogin}}{{/name}}:this is name
//{{#lastLogin}}{{formatLogin}}{{/lastLogin}}:this is lastLogin
if(!/Date\]$/.test(Object.prototype.toString.call(this))){
return "Invalid Date:"+this;
}
return this.getFullYear()
+"-"+this.getMonth()+1
+"-"+this.getDate();
}
};
var output = Mustache.render(templates.test, data);
console.log(output);
答案 3 :(得分:1)
您可以使用简单的String方法获取时间戳:
goalsCollection.targetDate = goalsCollection.targetDate.substring(6,18);
当然,这取决于您的时间戳每次都是相同的长度。另一种选择是:
goalsCollection.targetDate =
goalsCollection.targetDate.substring(6, goalsCollection.targetDate.length - 1);
这些技术并非特定于Mustache,可用于处理任何库的数据。有关详细信息,请参阅Mozilla Developer Center Documentation on substring。
答案 4 :(得分:0)
要在json中声明一个函数,你总是可以这样做。
var json = '{"RESULTS": true, "count": 1, "targetdate" : "/Date(1606953600000)/"}'
var obj = JSON.parse(json);
obj.newFunc = function (x) {
return x;
}
//OUTPUT
alert(obj.newFunc(123));
答案 5 :(得分:-2)
由于能够在客户端/服务器之间共享,我一直在为我的项目使用Mustache。我最终做的是将所有值(日期,货币)格式化为服务器端的字符串,因此我不必依赖辅助Javascript函数。但是,如果您在客户端对这些值进行逻辑操作,这可能不适合您。
您可能还想查看使用handlebars.js,它本质上是Mustache,但扩展可能有助于客户端格式化(以及更多)。这里的损失是你可能无法找到服务器端的把手实现,如果这对你很重要。