ExtJS:关联的 idProperty 的转换函数未触发
ExtJS: Associated idProperty's convert function not firing
在我的模型中,我将 idProperty 作为我使用计算函数构造的复合键(也尝试了转换函数)。但是,似乎无论您将哪个字段设置为 idProperty,calculate/convert 函数都不会触发。这在文档的某处有介绍吗?另外,我该如何规避这种情况?我想我可以听商店的负载并手动设置属性,但这很烦人。另外,我这样做是因为我想在刷新时保持网格先前的选择。
在下面的示例中,您会看到 console.log 没有触发,因此,当我单击 "Refresh" 按钮时,我的选择不会保留。这是 example:
Ext.application({
name : 'Fiddle',
launch : function() {
Ext.define('MyModel', {
extend: 'Ext.data.Model',
idProperty: 'composite',
fields: [{
name: 'composite',
type: 'string',
calculate: function(data) {
console.log(data.name + data.num);
return ata.name + data.num;
}
}, {
name: 'name',
type: 'string'
}, {
name: 'num',
type: 'int'
}]
});
var store = Ext.create('Ext.data.Store', {
model: 'MyModel',
autoLoad: true,
proxy: {
type: 'ajax',
url: 'data1.json'
}
});
function onClickRefreshButton() {
store.load();
}
var button = Ext.create('Ext.button.Button', {
text: 'Refresh',
renderTo: Ext.getBody(),
listeners: {
click: onClickRefreshButton
}
});
var grid = Ext.create('Ext.grid.Panel', {
store: store,
renderTo: Ext.getBody(),
height: 300,
width: 300,
title: 'My Grid',
columns: [{
text: 'Name',
dataIndex: 'name'
}, {
text: 'Num',
dataIndex: 'num'
}]
});
}
});
我认为您可以在 reader 中使用 transform
函数,例如:
reader: {
type: 'json',
transform: {
fn: function(res) {
return res.map(function(item) {
item.composite = item.name + item.num;
return item;
});
}
}
}
If a transform function is set, it will be invoked just before
readRecords executes. It is passed the raw (deserialized) data object.
The transform function returns a data object, which can be a modified
version of the original data object, or a completely new data object.
另一种方法是不设置
idProperty: 'composite',
在这种情况下,convert/calculate 按预期工作。
为什么不为idProperty调用convert/calculate:
idProperty 是唯一的并且永远不会改变(这是一个 属性 ID)因此它们不支持计算或转换。
因此必须在创建模型时设置它们。
工作代码 here
希望对您有所帮助!
在我的模型中,我将 idProperty 作为我使用计算函数构造的复合键(也尝试了转换函数)。但是,似乎无论您将哪个字段设置为 idProperty,calculate/convert 函数都不会触发。这在文档的某处有介绍吗?另外,我该如何规避这种情况?我想我可以听商店的负载并手动设置属性,但这很烦人。另外,我这样做是因为我想在刷新时保持网格先前的选择。
在下面的示例中,您会看到 console.log 没有触发,因此,当我单击 "Refresh" 按钮时,我的选择不会保留。这是 example:
Ext.application({
name : 'Fiddle',
launch : function() {
Ext.define('MyModel', {
extend: 'Ext.data.Model',
idProperty: 'composite',
fields: [{
name: 'composite',
type: 'string',
calculate: function(data) {
console.log(data.name + data.num);
return ata.name + data.num;
}
}, {
name: 'name',
type: 'string'
}, {
name: 'num',
type: 'int'
}]
});
var store = Ext.create('Ext.data.Store', {
model: 'MyModel',
autoLoad: true,
proxy: {
type: 'ajax',
url: 'data1.json'
}
});
function onClickRefreshButton() {
store.load();
}
var button = Ext.create('Ext.button.Button', {
text: 'Refresh',
renderTo: Ext.getBody(),
listeners: {
click: onClickRefreshButton
}
});
var grid = Ext.create('Ext.grid.Panel', {
store: store,
renderTo: Ext.getBody(),
height: 300,
width: 300,
title: 'My Grid',
columns: [{
text: 'Name',
dataIndex: 'name'
}, {
text: 'Num',
dataIndex: 'num'
}]
});
}
});
我认为您可以在 reader 中使用 transform
函数,例如:
reader: {
type: 'json',
transform: {
fn: function(res) {
return res.map(function(item) {
item.composite = item.name + item.num;
return item;
});
}
}
}
If a transform function is set, it will be invoked just before readRecords executes. It is passed the raw (deserialized) data object. The transform function returns a data object, which can be a modified version of the original data object, or a completely new data object.
另一种方法是不设置
idProperty: 'composite',
在这种情况下,convert/calculate 按预期工作。
为什么不为idProperty调用convert/calculate:
idProperty 是唯一的并且永远不会改变(这是一个 属性 ID)因此它们不支持计算或转换。
因此必须在创建模型时设置它们。 工作代码 here
希望对您有所帮助!