Celleditor对象值Extjs4

时间:2012-02-22 15:40:46

标签: javascript 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

3 个答案:

答案 0 :(得分:1)

编辑器接受列的“dataIndex”字段中提供的任何值。由于“名称”是一个对象,这就是你得到的。在编辑器中输入名称后,value等于字符串(不是对象),并且渲染器正在尝试获取字符串的name属性。

解决此问题的最简单方法是将商店的“名称”字段设为字符串而不是对象。但是,我假设你有理由这样做。

CellEditing插件有三个可以监听的事件:beforeedit,edit和validateedit。您可以实现beforeedit侦听器以从列中获取“name”对象,然后获取该对象的“name”属性并使用该值填充编辑器。然后在validateedit上,从编辑器中获取值,并使用该值设置记录中“name”对象的“name”属性。

为了快速参考,这里是事件定义:CellEditing events

答案 1 :(得分:1)

您可以在模型上覆盖getset方法,因此它将支持多级字段名称。以下是示例实现。

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/

答案 2 :(得分:0)

更简单的方法是修改用户模型对象以不同方式映射“名称”属性:

{name: "name", mapping:'name.name'}

然后其他一切都保持不变。