计算/转换前端中的id字段

时间:2018-05-16 09:36:37

标签: extjs

我正在尝试计算/转换前端的id,但它不是由ExtJS完成的。例如:

fields: [{
    name: 'test',
    type: 'int'
}, {
    name: 'id',
    depends: [
        'test'
    ],
    convert: function(v, rec) {
        return rec.get('test')%10;
    }
}]

如果我现在加载到商店的五条记录,其中“test”的值为1,2,3,5,11,

  • id应该是从“test”的值计算的int,而不是自动生成的。
  • test = 11的记录应该有id = 1,因此用test = 1覆盖记录(也是id = 1)

https://fiddle.sencha.com/#view/editor&fiddle/2gpp

但是,这不能按预期工作,id始终是自动生成的,因此,重复数据删除无法按预期工作。

为什么会这样,我该如何解决?

2 个答案:

答案 0 :(得分:1)

您应该考虑使用mapping方法接收使用reader配置的原始json数据,并且可以进行任何类型的预处理。而calculateconvert方法限制了对数据的访问,这些数据需要在使用之前在字段中定义。

fields: [{
    name: 'test',
    type: 'int'
}, {
    name: 'id',
    mapping(data){
        return data.test % 10;   
    }
}]

答案 1 :(得分:0)

不工作的主要原因是idProperty模型。

Defaults to:'id'

如果您要更改模型或字段名称中的idProperty而不是id,则depends配置将有效。

您可以使用depends配置检查此工作 FIDDLE 。希望这有助于/指导您使用depends config。

解决问题

CODE SNIPPET

Ext.application({
    name : 'Fiddle',

    launch : function() {
        Ext.define('ModelName', {
            extend: 'Ext.data.Model',
            idProperty:'test',
            fields: [{
                name: 'test',
                type: 'int'
            }, {
                name: 'id',
                depends: ['test'],
                convert: function(v, rec) {
                    return rec.get('test')%10;
                }
            }]
        });
        var store = Ext.create('Ext.data.Store', {
            model: 'ModelName',
            proxy: {
                type: 'ajax',
                url: 'data1.json',
                reader: {
                    type: 'json',
                    rootProperty: 'data'
                }
            }
        });
        store.on('load', function() {
            // Due to clashes between the calculated id,
            // the store should contain four records.
            console.log(store.getRange());
        });
        store.load();

        Ext.define('ModelName1', {
            extend: 'Ext.data.Model',
            fields: [{
                name: 'test',
                type: 'int'
            }, {
                name: '_id',
                depends: ['test'],
                convert: function(v, rec) {
                    return rec.get('test')%10;
                }
            }]
        });
        var store1 = Ext.create('Ext.data.Store', {
            model: 'ModelName1',
            proxy: {
                type: 'ajax',
                url: 'data1.json',
                reader: {
                    type: 'json',
                    rootProperty: 'data'
                }
            }
        });
        store1.on('load', function() {
            // Due to clashes between the calculated id,
            // the store should contain four records.
            console.log(store1.getRange());
        });
        store1.load();
    }
});