我正在寻找一个如何做到这一点的最佳解决方案。 我有什么:
// model
Ext.define("User", {
extend: "Ext.data.Model",
fields: [
{name: "id", type: "int"},
{name: "name"},
{name: "description", type: "string"}
]
});
// store with data
var oStore = new Ext.data.Store({
model: "User",
data: [
{id: 1, name: {name:"John"}, description: "Fapfapfap"},
{id: 2, name: {name:"Danny"}, description: "Boobooboo"},
{id: 3, name: {name: "Tom"}, description: "Tralala"},
{id: 4, name: {name:"Jane"}, description: "Ololo"},
]
});
// and finally I have a grid panel
Ext.create("Ext.grid.Panel", {
columns: [
{dataIndex: "id", header:"ID"},
{
dataIndex: "name",
header: "Name",
renderer: function(value){return value.name;},
editor: "textfield"},
{dataIndex: "description", header: "Description", flex: 1, editor: "htmleditor"}
],
plugins: [new Ext.grid.plugin.CellEditing({clicksToEdit: 2})],
store: store,
renderTo: document.body
});
当我在单元格上双击时,我在编辑器的字段中看到[object] Object
,当我输入有效值时,我在网格中看到空单元格。
所以,问题是 - 如何设置celleditor来获取数据不是来自record.name
而是来自record.name.name
?
答案 0 :(得分:1)
编辑器接受列的“dataIndex”字段中提供的任何值。由于“名称”是一个对象,这就是你得到的。在编辑器中输入名称后,value等于字符串(不是对象),并且渲染器正在尝试获取字符串的name属性。
解决此问题的最简单方法是将商店的“名称”字段设为字符串而不是对象。但是,我假设你有理由这样做。
CellEditing插件有三个可以监听的事件:beforeedit,edit和validateedit。您可以实现beforeedit侦听器以从列中获取“name”对象,然后获取该对象的“name”属性并使用该值填充编辑器。然后在validateedit上,从编辑器中获取值,并使用该值设置记录中“name”对象的“name”属性。
为了快速参考,这里是事件定义:CellEditing events
答案 1 :(得分:1)
您可以在模型上覆盖get
和set
方法,因此它将支持多级字段名称。以下是示例实现。
Ext.define("User", {
extend: "Ext.data.Model",
fields: [
{name: "id", type: "int"},
{name: "name"},
{name: "description", type: "string"}
],
get: function(key) {
if (Ext.isString(key) && key.indexOf('.') !== -1) {
var parts = key.split('.');
var result = this.callParent([ parts[0] ]);
return result[parts[1]];
}
return this.callParent(arguments);
},
set: function(key, value) {
if (Ext.isString(key) && key.indexOf('.') !== -1) {
var parts = key.split('.');
var result = this.get(parts[0]);
result[parts[1]] = value;
this.callParent([ parts[0], result ]);
return;
}
this.callParent(arguments);
}
});
我不确定商店是否检测到对name.name字段所做的更改。如果不是,您还应该将记录标记为脏。
答案 2 :(得分:0)
更简单的方法是修改用户模型对象以不同方式映射“名称”属性:
{name: "name", mapping:'name.name'}
然后其他一切都保持不变。