如何在 Sencha Touch 2 模型中存储日期

Posted

技术标签:

【中文标题】如何在 Sencha Touch 2 模型中存储日期【英文标题】:How do I store dates in Sencha Touch 2 Models 【发布时间】:2012-05-12 12:27:14 【问题描述】:

在 sencha touch 2 中,似乎只有 string、int、float、boolean 数据类型。那么如何存储日期时间?

更新

好的,我发现我可以使用convert() 来转换值:http://docs.sencha.com/touch/2-0/#!/api/Ext.data.Types

convert : Function 从数据转换原始数据值的函数 块进入要存储在字段中的数据。函数通过 下列参数: - v : 混合 读取的数据值 阅读器,如果未定义将使用配置的 defaultValue。 - 录制:混合 包含由 Reader 读取的行的数据对象。根据 Reader 类型,这可能是一个数组(ArrayReader),一个对象 (JsonReader) 或 XML 元素。

// Add a new Field data type which stores a VELatLong object in the Record.
Ext.data.Types.VELATLONG = 
    convert: function(v, data) 
        return new VELatLong(data.lat, data.long);
    ,
    sortType: function(v) 
        return v.Latitude;  // When sorting, order by latitude
    ,
    type: 'VELatLong'
;

但我不太了解代码。对于convert(),参数设置是什么?为什么第一个参数未使用,它何时以及用于什么用途?如何获取/设置此类自定义类型(在convert() 中是否变为vdata)?

【问题讨论】:

我会在这方面做进一步的工作。希望在接下来的几天里能给你一个答案。敬请期待:) 【参考方案1】:

http://docs.sencha.com/touch/2-0/#!/api/Ext.data.Types-property-DATE 哦,日期数据类型...

无论如何,在回答您的问题之前! (有关日期数据类型示例,请参见 tl;dr)

http://docs.sencha.com/touch/2-0/#!/api/Ext.data.Field-cfg-convert

将 Reader 提供的值转换为将存储在模型中的对象的函数。它传递了以下参数:

v : 混合

Reader 读取的数据值,如果未定义将使用配置的 defaultValue。 rec : Ext.data.Model

到目前为止阅读器读取的包含模型的数据对象。请注意,此时模型可能未完全填充,因为字段是按照它们在字段数组中定义的顺序读取的。

Ext.define('Dude', 
    extend: 'Ext.data.Model',
    fields: [
        name: 'locationInCity',  convert: function(rawDataValue,record)
            return record.location+', '+record.city //would be something like Sprooklyn,Springfield
        ,
        name: 'firstname', mapping: 'name.first',
        name: 'lastname',  mapping: 'name.last',
        name: 'city', defaultValue: 'homeless',
        'state',
        name: 'location',  convert: location
    ]
);

啊,此时我找到了您示例的来源;)

// Add a new Field data type which stores a VELatLong object in the Record.
Ext.data.Types.VELATLONG = 
    convert: function(v, data)  // convert(value,record)
        return new VELatLong(data.lat, data.long); //VELatLong was declared previously in another library as something according to example
    ,
    sortType: function(v) 
        return v.Latitude;  // When sorting, order by latitude //VELatLong will have lat and long properties, this is for complex sorting
    ,
    type: 'VELatLong' //This is what we use to reference it.
;

所有这些都或多或少地声明了一个新的数据类型。它看起来像

// Add a new Field data type which stores a VELatLong object in the Record.
Ext.data.Types.tehDate = 
    convert: function(v, data)  // convert(value,record)
        return new date(v);
    ,
    sortType: function(v) 
        return v; // eh i have no idea whether its going to actually just accept date comparisons, though no there's real reason why it shouldn't
    ,
    type: 'tehDate' //This is what we use to reference it.

;

^-- some of this is untested.

TL;DR

现在来实际回答您的 -original- 问题:

Ext 有一个可以使用的日期类型:Ext.data.Types.DATE(以及其他一些)。

我假设 type: date 没有用,否则我们不会在这里!所以可能只有 4 个被正确引用。 但!这确实有效:

var types = Ext.data.Types; // allow shorthand type access
Ext.define('Unit', 
    extend: 'Ext.data.Model',
    config: 
        fields: [
             name: 'dated', type: types.DATE ,
             name: 'pie', type: 'string' ,
        ]
    
);
abc=Ext.create('Unit',
    dated: new Date().toString(),
    pie:'hello'
)
console.log(abc)
console.log(abc.get('dated').getUTCFullYear())//it liiiiives!

工作代码的小提琴:

http://www.senchafiddle.com/#w97Oe

【讨论】:

【参考方案2】:

只是以简单的方式包装以上所有内容:

是的,您可以轻松地将日期存储为模型中的日期。为此,您需要:

    在模型中指定字段类型(记得在 app.js 中的 required 字段中包含文件 Ext.data.Types):

    name: 'date', type: Ext.data.Types.DATE, dateFormat: 'd.m.Y';
    

    在您的 XTemplates 中为该字段使用具有日期格式的修饰符:

    date:date("d.m.Y") 
    

    在发送到服务器之前正确地将日期字段转换回字符串。例如,我以"d.m.Y" 格式存储日期,所以我进行以下转换:

    Ext.Date.format(form.getValues().date, 'd.m.Y').
    

就是这样!现在您拥有原生日期字段的所有功能,即您可以毫不费力地进行分组、排序等。

【讨论】:

我想我是在吃糖的时候写这篇文章的……:/【参考方案3】:

Sencha Touch 1.0 支持date type in Model。

但是,Sencha Touch 2 仅支持 仅 4 种模型数据类型。

字符串 整数 浮动 布尔值

您可以做的是您可以将您的date 转换为String 格式,然后再将其转换为 date 使用 API 的对象。

【讨论】:

所以我在煎茶之外做所有的事情?意思是我不能使用 Sencha/Ext 的模型验证等?我正在使用 Sencha 模型的验证和单独进行日期验证来验证所有内容,这似乎有点奇怪? 别无选择,除非你想回到ST1 杰孟是对的。实际上有一个更好的选择来创建带有验证的自定义数据类型。改用 String 可能会起作用,但不是程序化的,因为验证完全不在模型定义中。我会在这方面做进一步的工作。希望在接下来的几天里能给你一个答案。敬请期待:) 这个答案是错误的。 Sencha Touch 2 绝对有一个“日期”类型。看看docs.sencha.com/touch/2-0/#!/api/Ext.data.Field-cfg-type

以上是关于如何在 Sencha Touch 2 模型中存储日期的主要内容,如果未能解决你的问题,请参考以下文章

在 Sencha Touch 中重用 ExtJS 的模型和存储

Sencha Touch:如何更新数据存储以从控制器列出

如何在 Sencha Touch 2 中使用 Sqlite

如何使用 Sencha Touch 数据模型读取嵌套的 JSON 结构?

Sencha Touch 2:数据集成或如何在sencha和javascript之间共享动态信息

使用 store sencha touch 2 将数据加载到 List