我想在服务器返回数据后立即将时间戳转换为自定义日期格式。 我尝试在Ext.data.field中使用“convert”:http://docs.sencha.com/ext-js/4-1/#!/api/Ext.data.Field-cfg-convert
但我无法做对。这是我的模特。
Ext.define('AM.model.Comment',{
extend: 'Ext.data.Model',
fields: [
{ name: 'createdTime', type: 'date', convert:function(v,record){record.parseDate(v,record);}}, // datetime
],
proxy: {
type: 'rest',
url:'../comments',
writer:{
type:'json'
},
reader: {
type: 'json'
}
},
parseDate:function(v,record){
console.log(v); //show 1347465600000
console.log(Ext.Date.format(new Date(v), 'Y-m-d')); //show 2012-09-13
return Ext.Date.format(new Date(v), 'Y-m-d');
}
});
加载后,我检查了firebug,发现“createdTime”字段为“undefined”。 有人可以指出我的错误吗?谢谢!
我可以在不使用“转换”的情况下实现这一点,只需在其他组件中使用Ext.Date.format(new Date(v), 'Y-m-d')
即可。但我认为在模型中这样做会更好。然后,每个组件始终可以读取正确的日期格式作为查询它。
答案 0 :(得分:5)
我找到了解决方案。我没有使用“convert”,而是覆盖了reader的getData()方法。
Ext.define('AM.model.Comment',{
extend: 'Ext.data.Model',
fields: [
{ name: 'createdTime', type: 'datetime'},
],
proxy: {
type: 'rest',
url:'../comments',
writer:{
type:'json'
},
reader: {
type: 'json',
getData:function(data){
for(i = 0; i < data.length; i++){
data[i].createdTime = Ext.Date.format(new Date(data[i].createdTime), "Y-m-d");
}
return data;
}
}
}
});
如果有人有更好的解决方案,请告诉我。我仍然想知道为什么“转换”不起作用。如果有人知道原因,请告诉我。谢谢!
答案 1 :(得分:2)
没有商店的答案会考虑作者吗?通过实现行的渲染器()...可以轻松地将其显示为格式化日期,而读/写可能需要实现模型的功能。考虑到从PHP到JavaScript时间的转换因子是1000,而可以省略该部分,同时以毫秒为单位表示时间(示例中的rawValue可以是整数类型或类型为date):
Ext.define('AM.model.Comment', {
extend: 'Ext.data.Model',
fields: [{
name: 'createdTime',
type: 'DATETIME',
/* .convert() is triggered twice - on read and on write */
convert: function(rawValue, model) {
/* only convert, when rawValue appears to be an integer */
if(parseInt(rawValue) > 0){
return Ext.util.Format.date(new Date(parseInt(rawValue)*1000), 'Y-m-d');
}
/* it's a date already */
else if(typeof(rawValue) == 'object'){
return rawValue;
}
}
}]
});
答案 2 :(得分:1)
不确定您是否仍然关心,但您的转换解决方案可行,但您只是错过了退货。这就是你所拥有的。
fields: [
{ name: 'createdTime', type: 'date', convert: function(v, record) {
record.parseDate(v,record);
}}, // datetime
如果你看一下,你就错过了转换中的回报,所以应该是这个
{ name: 'createdTime', type: 'date', convert: function(v,record) {
return record.parseDate(v,record);
}}, // datetime
答案 3 :(得分:0)
您可以在模型中进行映射。我认为主要问题是,你错过了&#39;返回&#39;单词转换&#39;功能
如果它不起作用,请尝试在格式
之前转换为javascript日期Ext.define('AM.model.Comment',{
extend: 'Ext.data.Model',
fields: [
{
name: 'createdTime', type: '**datetime**', convert:function(v,record){
return Ext.Date.format(new Date(v), 'Y-m-d');
}
},
],
proxy: {
type: 'rest',
url:'../comments',
writer:{
type:'json'
},
reader: {
type: 'json'
}
}
});