EXTJS + Обновление магазина с идентификатором базы данных после сохранения сетки - PullRequest
9 голосов
/ 14 сентября 2010

Я пытаюсь узнать, как использовать сетки 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 отправляет обратно созданную строку с новым идентификатором базы данных, и я предполагал, что EXTJS автоматически свяжет новый сгенерированный идентификатор базы данных со строкой. Это позволяет пользователю дополнительно редактировать эту строку и вызывать обновление вместо вставки.

Вместо этого строка продолжает иметь пустой идентификатор пользователя, поэтому при дополнительном сохранении создается еще один новый пользователь.

Так что либо:

  • EXTJS должен разрешать сгенерированные идентификаторы строк автоматически, а я просто делаю что-то не так.
  • Я должен вручную перезагружать сетку после каждого сохранения дополнительным вызовом REST.

Я просматривал документацию и форумы EXTJS, но мне неясно, какой подход правильный.

Может кто-нибудь уточнить?

РЕДАКТИРОВАТЬ: я пытался вернуть Success = True в JSON, чтобы соответствовать SuccessProperty, однако это все еще не работает.

РЕДАКТИРОВАТЬ # 2: Пока единственное, что я обнаружил, что работает, это делать "userDataStore.reload ()" после сохранения, однако, поскольку я возвращал содержимое хранилища обратно после сохранения, я надеялся, что EXTJS сделает понять это и обновить значения строк.

Ответы [ 3 ]

2 голосов
/ 16 сентября 2010
    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 <b>newRecOrderNo</b> to the record to 
identify the record after response. When user will post data to server after 
inserting you must get a new <b>ID</b> and associate it to <b>newRecOrderNo</b> 
<i>(like Map<Integer,Integer>)</i>. Then return json object like that : 
<b>
{
    success : true,
    newIdes : {
           1 : 23,
           2 : 34
    }
}
</b>

Then when you get response do set proper IDs to records:
<b>
   userDataStore.each(function(rec){
       if(rec.data.newRecOrderNo){
           rec.data.ID = response.newIdes[rec.data.newRecOrderNo];
           delete rec.data.newRedOrderNo;
       }
   })
</b>
})

1 голос
/ 23 июня 2012

Да, он устанавливает id (а также другие поля, если сервер возвращает их измененные значения), если create ajax backend возвращает запись с установленным id, по крайней мере, в extjs 4.1. Вы должны вернуть вставленную запись с установленным идентификатором под ключом «root» в качестве словаря json, в этом примере корень - «Данные», т. Е .:

{
  "Data": {
    "ID": 8932,
    "NT_ID": 28738273,
    ...
    "CurrentRoleCode": "aaa",
  },
  "success": true
}
0 голосов
/ 15 сентября 2010

Вам нужно перезагрузить магазин с новыми параметрами в обработчике savebtn лайк store.reload ();

конечно, вы можете добавить больше параметров для загрузки действия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...