2

我想在服务器返回数据后立即将时间戳转换为自定义日期格式。我尝试在 Ext.data.field 中使用“转换”: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”字段是“未定义”。有人可以指出我的错误吗?谢谢!

我可以在不使用“转换”的情况下实现这一点,只需Ext.Date.format(new Date(v), 'Y-m-d')在其他组件中使用。但我认为在模型中这样做会更好。然后每个组件总是可以在查询时读取正确的日期格式。

4

4 回答 4

5

我找到了解决方案。我没有使用“转换”,而是覆盖了阅读器的 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;
            }
        }
    }
});

如果有人有更好的解决方案,请告诉我。而且我仍然想知道为什么“转换”不起作用。如果有人知道原因,也请告诉我。谢谢!

于 2012-09-30T06:45:20.683 回答
2

没有一个商店的答案会考虑作者吗?通过实现行的 renderer() 可以轻松地将其显示为格式化日期......而读/写可能需要实现模型的功能。考虑到从 PHP 到 JavaScript 时间的转换因子是 1000,而可以省略该部分,而以毫秒为单位表示时间(示例中的 rawValue 可以是整数类型或日期类型):

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;
        }
      }
   }]
});
于 2014-12-20T16:42:37.480 回答
1

不确定您是否仍然关心,但您的 Convert 解决方案可以工作,但您只是错过了回报。这就是你所拥有的。

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
于 2015-01-15T00:15:22.787 回答
0

您可以在模型中进行映射。我认为主要问题是您在“转换”功能中错过了“返回”字样。

如果它不起作用,请尝试在格式之前转换为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'
    }
} 

});

于 2014-03-18T07:39:03.893 回答