首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在ExtJS6中通过模型的convert方法访问其他商店记录?

如何在ExtJS6中通过模型的convert方法访问其他商店记录?
EN

Stack Overflow用户
提问于 2017-02-22 01:58:19
回答 1查看 1.5K关注 0票数 1

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

型号:

代码语言:javascript
运行
复制
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?
        }}
    ]
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-22 04:06:58

模型不知道记录,它只表示单个记录,convert方法的目的是允许您转换值,或者将其他字段组合成单个值(注意,除非您定义“依赖”来引用其他字段,否则在这种情况下,只有在加载数据时才会调用转换,而不是当它所依赖的字段发生更改时调用转换)。

当您创建网格时,网格使用存储,存储包含记录的集合,这将是执行此操作的地方。

在你的存储配置中,你可以为“datachanged”添加一个监听器,它将在存储中添加或删除记录时触发,从这里你可以遍历存储中的所有记录,计算出最大值,并用它更新记录。

代码语言:javascript
运行
复制
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();
        }
    }
});

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

代码语言:javascript
运行
复制
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
            }
        }
    },
});

同样值得澄清的是,如果你真的需要复制这个值,我假设你想要以某种方式在网格内引用,可能是在渲染器中,而不是只需在存储上设置该值:

代码语言:javascript
运行
复制
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的百分比):

代码语言:javascript
运行
复制
{
    dataIndex:'value',
    renderer:function(value, metaData, record, rowIndex, colIndex, store, view){
        return Math.round((100/store.maxValue)*value)+'%';
    }
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42374586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档