EXTJS +保存网格后使用数据库ID更新商店

时间:2010-09-14 05:36:57

标签: javascript extjs

我正在尝试学习如何在管理应用中的表格上使用EXTJS网格进行一些简单的CRUD操作。

我有一个简单的网格,允许有人编辑用户,商店定义为:

        var userDataStore = new Ext.data.Store({
            id: 'userDataStore',
            autoSave: false,
            batch: true,
            proxy: new Ext.data.HttpProxy({
                api: {
                    read: '/Admin/Users/All',
                    create: '/Admin/Users/Save',
                    update: '/Admin/Users/Save'
                }
            }),
            reader: new Ext.data.JsonReader(
            {
                root: 'Data',                    
                idProperty: 'ID',
                totalProperty: 'total',
                successProperty: 'success',
                messageProperty: 'message'
            }, [
                { name: 'ID', type: 'string', allowBlanks: false },
                { name: 'NT_ID', type: 'string', allowBlank: false },
                { name: 'EMail', type: 'string', allowBlank: false },
                { name: 'Name', type: 'string', allowBlank: false },
                { name: 'Enabled', type: 'bool', allowBlank: false },
                { name: 'CurrentRoleCode', type: 'string', allowBlank: false}]
            ),
            writer: new Ext.data.JsonWriter(
            {
                encode: false,
                writeAllFields: true,
                listful: true
            })
        });

这绑定到网格,我可以毫无问题地加载和保存用户。保存按钮如下所示:

   var saveButton = new Ext.Button({
            text: 'Save',
            disabled: true,
            handler: function() {
                userDataStore.save();                    
                pageState.ClearDirty();
                saveButton.disable();
            }
        });

但是,在创建新用户时,用户的JSON POST将发布到与“更新”相同的REST服务端点,唯一的区别是没有发布ID值(因为只有一个设置在从服务器加载时存储。)

这很有效,我可以创建用户。

save REST服务使用新的数据库ID发回创建的行,我假设EXTJS会自动将新生成的数据库ID绑定到该行。这允许用户进一步编辑该行,并导致更新而不是插入。

相反,该行继续具有空白用户ID,因此额外保存会创建另一个新用户。

所以:

  • EXTJS应该自动解决生成的行ID,我只是做错了。
  • 我应该在每次保存后使用额外的REST调用手动重新加载网格。

我一直在关注EXTJS文档和论坛,但我不清楚正确的方法。

有人可以澄清吗?

编辑:我尝试在JSON中返回Success = True以匹配SuccessProperty,但是这似乎仍然不起作用。

编辑#2:到目前为止,我发现保存的唯一功能就是“userDataStore.reload()”,但是因为我在保存后又回来了商店的内容,我希望EXTJS会了解并更​​新行值。

3 个答案:

答案 0 :(得分:2)

    I've got an idea that may help you. Let't suppose that user added a new 
record in grid, in that moment add a new property newRecOrderNo to the record to 
identify the record after response. When user will post data to server after 
inserting you must get a new ID and associate it to newRecOrderNo 
(like Map<Integer,Integer>). Then return json object like that : 

{
    success : true,
    newIdes : {
           1 : 23,
           2 : 34
    }
}


Then when you get response do set proper IDs to records:

   userDataStore.each(function(rec){
       if(rec.data.newRecOrderNo){
           rec.data.ID = response.newIdes[rec.data.newRecOrderNo];
           delete rec.data.newRedOrderNo;
       }
   })

})

答案 1 :(得分:1)

是的,它设置id(以及其他字段,如果服务器返回它们的修改值),如果 create ajax后端返回带有set id的记录,至少在extjs 4.1中。您应该在&quot; root&#39;下返回已设置ID的插入记录。 key作为json字典,在这个例子中,root是&#39; Data&#39;,即:

{
  "Data": {
    "ID": 8932,
    "NT_ID": 28738273,
    ...
    "CurrentRoleCode": "aaa",
  },
  "success": true
}

答案 2 :(得分:-1)

您需要在savebtn处理程序中使用新参数重新加载存储 喜欢 store.reload();

当然你可以添加更多参数加载动作