【问题标题】:EXTJS + Updating a store with the database ID after saving a gridEXTJS + 保存网格后使用数据库 ID 更新商店
【发布时间】:2010-09-14 05:36:57
【问题描述】:

我正在尝试学习如何使用 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 值(因为只有在从服务器加载时存储)。

这行得通,我可以创建用户。

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

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

所以要么:

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

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

有人可以澄清一下吗?

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

编辑#2:到目前为止,我发现唯一可行的方法是在保存后执行“userDataStore.reload()”,但是因为我在保存后返回了商店的内容,所以我希望 EXTJS 会理解这一点并更新行值。

【问题讨论】:

    标签: javascript extjs


    【解决方案1】:
    我有一个想法可以帮助你。假设用户添加了一个新的 在网格中记录,在那一刻添加一个新属性 newRecOrderNo 到记录中 响应后识别记录。用户何时将数据发布到服务器后 插入您必须获得一个新的 ID 并将其关联到 newRecOrderNo (如地图。然后像这样返回 json 对象: { 成功:是的, 新想法:{ 1:23, 2 : 34 } } 然后,当您收到响应时,请为记录设置正确的 ID: userDataStore.each(函数(rec){ 如果(rec.data.newRecOrderNo){ rec.data.ID = response.newIdes[rec.data.newRecOrderNo]; 删除rec.data.newRedOrderNo; } }) })

    【讨论】:

      【解决方案2】:

      是的,它设置 id(以及其他字段,如果服务器返回它们的修改值),如果 create ajax 后端返回设置 id 的记录,至少在 extjs 4.1 中。您应该在 'root' 键下作为 json 字典返回插入的记录,并设置 id,在此示例中,根为 'Data',即:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2014-09-06
          • 2013-09-22
          • 2014-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-30
          • 1970-01-01
          相关资源
          最近更新 更多