对象值Extjs4的单元格编辑器
Celleditor for object value Extjs4
我正在寻找如何做到这一点的最佳解决方案。我所拥有的:
// 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
获取数据?
您可以覆盖模型上的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字段的更改。若并没有,您可能还应该将记录标记为脏记录。
工作样品:http://jsfiddle.net/lolo/dHhbR/2/
编辑器接受列的"dataIndex"字段中提供的任何值。既然"name"是一个对象,那就是你得到的。在编辑器中输入名称后,值等于字符串(而不是对象),并且渲染器正在尝试获取字符串的name属性。
解决此问题的最简单方法是将存储的"name"字段设置为字符串,而不是对象。然而,我认为你想这样做是有原因的。
CellEditing插件有三个可以监听的事件:beforedit、edit和validatedit。您可以实现一个beforedit侦听器,从列中获取"name"对象,然后获取该对象的"name"属性,并用该值填充编辑器。然后在validatedit上,从编辑器中获取值,并使用该值设置记录中"name"对象的"name"属性。
为了快速参考,这里有事件定义:CellEditing事件
一种更简单的方法是修改用户模型对象,以不同的方式映射"名称"属性:
{name: "name", mapping:'name.name'}
那么其他一切都保持不变。
相关文章:
- ExtJS网格单元格编辑器,防止焦点松动问题
- dhtmlx添加新行并启动单元格编辑器
- 可以将单元格编辑为下拉列表并使用 JQGard 进行多选
- 在单元格编辑时获取extjs中的行数据
- Kendo ui Grid:标准的HTML5输入日期时间可以用作单元格编辑器吗
- 如何在编辑行调用中使用 jqGrid 单元格编辑进行滚动
- 禁用光滑网格中的特定单元格编辑
- 启用 JQ 网格上的“保存”按钮,其中包含内联编辑和单元格编辑
- nggrid单元格编辑:在编辑之前获取值
- Extjs从单元格编辑器访问网格记录
- 如何只允许在jqGrid单元格编辑中使用数字
- 对象值Extjs4的单元格编辑器
- 如何在DojoGridX的单元格编辑器中根据另一个单元格的值过滤select组件的选项
- 如何在可编辑的GridX中将局部变量作为属性提供给单元格编辑器
- 如何使用extjs存储管理器进行单元格编辑
- Slickgrid自定义单元格编辑器更新所有单元格
- JQGrid子网格和父网格中的单元格编辑
- ExtJs - Javascript -网格中的组合框(单元格编辑插件)-网格/窗口后面的下拉列表
- 单元格编辑网格中的组合框编辑器在选择值后不会取消选择
- ExtJS 4不能在网格内的组合中呈现值(单元格编辑器插件)