如何从ExtJS6中的Model转换方法访问其他Store记录?

时间:2017-02-21 17:58:19

标签: extjs extjs6

我试图在模型中有一个类似于value (maxValue)的计算字段,其中maxValue是当前加载的所有其他记录中的最大值(想想网格的当前页面)。 / p>

型号:

Ext.define('MyApp.model.Example', {
    extend: 'Ext.data.Model',
    fields: [
        {name: 'id'},
        {name: 'value'},
        {name: 'calculated_value', convert: function(value, record){
            //how to access all the records here, not just the current one?
        }}
    ]
});

1 个答案:

答案 0 :(得分:6)

模型不知道记录,它只表示单个记录,而convert方法旨在允许您转换值,或将其他字段组合成单个值(注意除非您定义"取决于& #34;要引用此实例中的其他字段,转换仅在加载数据时调用,而不是在它依赖的字段更改时调用。

当您创建网格时,网格使用商店,商店包含一组记录,这将是执行此操作的地方。

在您商店的配置中,您可以添加一个用于' datachanged'每当从商店添加或删除记录时都会触发,从这里你可以处理商店中的所有记录,计算出最大值,并用它来更新记录。

Ext.create('Ext.data.Store', {
    model: 'Example',
    proxy: {
        type: 'ajax',
        url : 'example.json',
        reader: {
            type: 'json'
        }
    },
    listeners:{
        datachanged:function(store){
            var maxValue=store.max('value');
            store.beginUpdate();
            store.each(function(record){
                record.set('calculated_value',maxValue);
            });
            store.endUpdate();
        }
    }
});

如果您从服务器加载商店,那么您将实现一个阅读器,这可能是一个更好的地方。

Ext.create('Ext.data.Store', {
    model: 'Example',
    proxy: {
        type: 'ajax',
        url : 'example.json',
        reader: {
            type: 'json',
            transform: {
                fn: function(data) {
                    var maxValue=0;
                    Ext.each(data.items,function(item){
                        if(item.value>maxValue) maxValue=item.value;
                    });
                    Ext.each(data.items,function(item){
                        item.calculated_value=maxValue;
                    });
                    return data;
                },
                scope: this
            }
        }
    },
});

如果你真的需要复制这个值,也值得澄清一下,我猜你想在网格中以某种方式引用,也许是在渲染器中,而你只需在商店中设置一次值:

Ext.create('Ext.data.Store', {
    model: 'Example',
    proxy: {
        type: 'ajax',
        url : 'example.json',
        reader: {
            type: 'json'
        }
    },
    listeners:{
        datachanged:function(store){
            store.maxValue=store.max('value');
        }
    }
});

然后在您的网格列配置中,添加/更新渲染器(在此示例中,我将值显示为maxValue的百分比):

{
    dataIndex:'value',
    renderer:function(value, metaData, record, rowIndex, colIndex, store, view){
        return Math.round((100/store.maxValue)*value)+'%';
    }
}