我试图在模型中有一个类似于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?
}}
]
});
答案 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)+'%';
}
}