editorGridPanel, метод save() и ответ с сервера
ИСПОЛЬЗУЮ EXT 3
Задаю ридер: var leftReader = new Ext.data.JsonReader({ root: 'dan', totalProperty: 'total' }, [ {name: 'x80402'}, {name: 'x375'}, {name: 'p70402'}, {name: 'ch23'} ] ); Задаю сторе: var wr=new Ext.data.JsonWriter ({ encode: true, writeAllFields: true }); var lStore = new Ext.data.Store({ autoDestroy: true, autoSave: false, successProperty: true, proxy: new Ext.data.HttpProxy({url: 'phps/mm160c07_t.php'}), baseParams: {c155: c155, priznak: 'left'}, reader: leftReader, writer: wr, sortInfo:{field: 'x80402', direction: "ASC"}, autoLoad: true, batchSave: true // ДЛЯ ЧЕГО ЭТА КОМАНДА???? }); Задаю чекбоксы: var checkboxLeft = new Ext.grid.CheckboxSelectionModel({ singleSelect: false }); Далее модель колонок, многие из которых можно редактировать: var leftCm = new Ext.grid.ColumnModel({ defaults: { sortable: true, menuDisabled: false, align: 'center' }, columns: [ checkboxLeft, {header: "№ п/п ", dataIndex: 'x80402', sortable: true, width: 45}, {header: "Должность", dataIndex: 'ch23', sortable: true, width: 200}, {header: "Фамилия И.О.", dataIndex: 'p70402', sortable: true, width: 200, editor: new fm.ComboBox({ name: 'c07p70402', fieldLabel: 'ФИО', store: mainStorec07, displayField: 'p70402', typeAhead: false, loadingText: 'Поиск...', emptyText: 'Введите ФИО', minChars: 3, anchor: '95%', pageSize: 5, triggerAction: 'all', hideTrigger: true, tpl: movieTpl, itemSelector: 'div.movie-item', onSelect: function(record){ this.setValue(record.data.getFio); var zam=Ext.getCmp('id_leftgrid').selModel.getSelections() var myst = Ext.getCmp('id_leftgrid').getStore(); var zzz=myst.getCount(); for (var zil=0; zil<zzz; zil++){ zInd=myst.find('ch23',myst.data.items[zil].data.ch23,0,false,false); row = myst.getAt(zInd).data; row.ch23=record.data.x745; } this.collapse(); } }) }, {header: "Дата подписи", dataIndex: 'x375', sortable: true, width: 100, renderer: getDateFont, editor: new fm.DateField({ allowBlank: true, type: 'date',format: 'd.m.Y' }) } ] }); Непосредственно сам грид: var leftGrid = new Ext.grid.EditorGridPanel({ id: 'id_leftgrid', store: lStore, enableHdMenu: false, height: 190, autoWidth: true, cm: leftCm, sm: checkboxLeft, clicksToEdit: '1' }); И привожу код кнопки, по клику на которую сохраняю: id: 'c07Save', xtype: 'tbbutton', text: '<b>Cохранить</b>', handler: function(sm){ leftGrid.store.save({ listeners: { beforesave: {fn: function(){ alert(9999); var success=Ext.util.JSON.decode(resp.responseText).success; var message=Ext.util.JSON.decode(resp.responseText).message; if (success){ Ext.Msg.alert('С О О Б Щ Е Н И Е ',message); }else Ext.Msg.alert('О Ш И Б К А',message); } }} }); } С сервера приходит ответ - success и message - я их сам формирую. Вопрос в том - как мне ответ поймать?? listeners не работает! Как же получить ответ с сервера об удачном сохранении? И второй вопрос - как передать для сохранения строки ТОЛЬКО отмеченные чекбоксами? При этом используя leftGrid.store.save() ???? |
Может не стоило так подробно расписывать?
|
Цитата:
в метод save параметры не передаются: http://docs.sencha.com/extjs/3.4.0/#...re-method-save, а вы туда лиснеры какието суёте. в доке по методу еще и написано какие ивенты он поднимает. например этот перед сохранением данных: http://docs.sencha.com/extjs/3.4.0/#...ent-beforesave хотите лиснеры установите их на стор: var lStore = new Ext.data.Store({ ... listeners : { beforesave: function (store, data) { ... } } })и делайте с данными перед отправкой что хотите |
Цитата:
Так мне надо ни перед отправкой! А после отправки получить ответ, что данные успешно сохранились! А почему листенерс пытался засунуть ни в сторе, так всё потому, что есть стандартная возможность у editorGridPanel - grid.store.save() - отправляет отредактированные данные на сервер,указанный в прокси... Мне ли вам объяснять - вы наверняка лучше меня про это знаете. Так потому и спрашиваю, что сам я не знаю как распознать в ексте ответ, после вызова grid.store.save(). Объект данных отправляется отлично, а вот в ответ ничего не приходит, поэтому не могу понять, когда на сервере insert закончился. Да и как назло ассинхронность в false в ext 3 поставить нельзя....в общем беда, очень жду помощи! |
Цитата:
есть еще события на сторе которые поднимаются при ответе сервера (все они есть в доке): http://docs.sencha.com/extjs/3.4.0/#...ore-event-save http://docs.sencha.com/extjs/3.4.0/#...re-event-write поставьте на них лиснеры, в них пропишите debugger, посмотрите в отладчике что приходит в аргументах и выберите какое из них вам подходит лучше. |
Цитата:
Fires if the server returns 200 after an Ext.data.Api.actions CRUD action. ... Fires if the server returns 200 after an Ext.data.Api.actions CRUD action. Success of the action is determined in the result['successProperty']property (NOTE for RESTful stores, a simple 20x response is sufficient for the actions "destroy" and "update". The "create" action should should return 200 along with a database pk). Вот этот ответ 200 - как бы его вытащить? Может из rs - типа response. Хм...завтра будет над чем подумать. Вечером завтра отпишусь о результатах. Ну не хочется мне отказываться от такой классной вещи как save() !!! Удобно приходят данные и возиться с отправкой не надо |
Сделал примерно так:
Ext.getCmp('id_leftgrid').store.save(); Ext.getCmp('id_leftgrid').store.commitChanges(); lStore.on('save', function(){ my_after_function(); }) Если нужен ответ с сервера, то можно вот так: Ext.getCmp('id_leftgrid').store.save(); Ext.getCmp('id_leftgrid').store.commitChanges(); lStore.on('exception', function(response){ alert(response.responseText); }) Может кому и пригодится :) Спасибо за помощь! |
Часовой пояс GMT +3, время: 06:33. |