submit textfield + grid in ExtJS
Имеется на одной форме:
1) текстовые поля (textfield), чекбоксы, ... 2) Ext.grid.Panel 3) Ну и кнопочка "submit", её код: buttons: [ { text: "Save", handler: function () { PanelData.submit({ waitMsg: lanLoading, url: "Handlers/...", success: function (form, action) { ... }, failure: function (form, action) { ... } }); } } ] Задача: отправить все данные одним потоком на сервак и с текстовых полей и с Грида. На сервере получаю данные только с тектовых полей, а вот данные Грида не приходят ... Прошу Вашей помощи! |
Цитата:
|
Первый Вариант (похожий на него) практически реализовал ...
Но вот второй - мне больше по душе ... ))) А, разве, нет более легкого решения, что бы одной кнопочкой 2-х или более зайцев ... ??? |
Цитата:
Цитата:
|
Подскажите, пожалуйста, уважаемый Ex_Soft !!!
Возможно ли сохраненить данных грида и получить ответ от сервера, типа такого: store.sync({ success: function (form, action) { //... }, failure: function (form, action) { //... } }); Возможно лди такое ??? Тут пишут, что НЕТ: http://www.sencha.com/forum/archive/...t-149887.html? Может за пол года что-то поменялось ??? |
Цитата:
Цитата:
Все ж доступно: Ext.data.AbstractStore.sync() if (needsSync && me.fireEvent('beforesync', operations) !== false) { options = options || {}; *!* me.proxy.batch */!* (Ext.apply(options, { operations: operations, listeners: me.getBatchListeners() })); } Ext.data.proxy.Proxy.batch() "...i так далi..." Посмотрев по диагонали, соглашусь с Цитата:
|
Ex_Soft,
ext-4.1 уже умеет принимать ответ с сервера. store.sync({ success: function () { Ext.Msg.alert("Сообщение", "Сохранено !!!"); }, failure: function () { Ext.Msg.alert("Сообщение", "Ошибка !!!"); } }); Вот только записи передаются при одном условии - если были какие-то изменения, да и в придачу асинхронно: 1) Новые 2) Удалённые 3) Изменённые В отличии от 4.0.7 - там всё передавал одним запросом и пофигу, были изменения или нет. Одно добавили а 10 убрали ... |
Цитата:
onBatchComplete: function(batchOptions, batch) { var scope = batchOptions.scope || this; if (batch.hasException) { if (Ext.isFunction(batchOptions.failure)) { Ext.callback(batchOptions.failure, scope, [ *!* batch, batchOptions */!* ]); } } else if (Ext.isFunction(batchOptions.success)) { Ext.callback(batchOptions.success, scope, [ *!* batch, batchOptions */!* ]); } if (Ext.isFunction(batchOptions.callback)) { Ext.callback(batchOptions.callback, scope, [ *!* batch, batchOptions */!* ]); } } и Ваша хотелка: Цитата:
Цитата:
sync: function(options) { var me = this, operations = {}, toCreate = me.getNewRecords(), toUpdate = me.getUpdatedRecords(), toDestroy = me.getRemovedRecords(), needsSync = false; if (toCreate.length > 0) { operations.create = toCreate; needsSync = true; } if (toUpdate.length > 0) { operations.update = toUpdate; needsSync = true; } if (toDestroy.length > 0) { operations.destroy = toDestroy; needsSync = true; } if ( *!* needsSync */!* && me.fireEvent('beforesync', operations) !== false) { options = options || {}; me.proxy.batch(Ext.apply(options, { operations: operations, listeners: me.getBatchListeners() })); } return me; }, Цитата:
Цитата:
|
Цитата:
store.proxy.extraParams.ParamTextField01 = "XXX01"; store.proxy.extraParams.ParamTextField02 = "XXX02"; store.save({ //Надо обязательно получить ответ: сохранило или же нет. }); Параметры - это Шапка: ТекстФилд, ЧексБоксы, КомбоБоксы, ..., их определённое количество (оно не меняется). Грид - табличная часть, количество меняется. Цитата:
Могу видео на ЮТуб закинуть ... Код такой: <script type="text/javascript" src='http://dev.sencha.com/deploy/ext-4.0.7-gpl/ext-all.js'></script> <link rel="stylesheet" href="http://dev.sencha.com/deploy/ext-4.0.7-gpl/resources/css/ext-all.css" /> .... // *** *** *** МОДЕЛЬ *** *** *** Ext.define('BarCode', { extend: 'Ext.data.Model', fields: ... // *** *** *** ХРАНИЛИЩЕ *** *** *** var storeGridBarCode = Ext.create('Ext.data.JsonStore', { restful: true, pageSize: 40, model: 'BarCode', proxy: { type: 'rest', //'ajax', batchActions: true, url: "Handlers/DirGrid.ashx?pID=BarCode", reader: { type: "json", successProperty: 'success', root: "BarCode", messageProperty: 'message' }, writer: { type: "json", encode: false, root: "BarCode" } } }); storeGridBarCode.load(); var rowEditing = Ext.create('Ext.grid.plugin.RowEditing'); // *** *** *** П-Е *** *** *** var PanelGridBarCode = Ext.create("Ext.grid.Panel", { autoScroll: true, store: storeGridBarCode, columns: [{...} ], plugins: [rowEditing], bbar: new Ext.PagingToolbar({ store: storeGridBarCode, displayInfo: true, displayMsg: 'Showing {0} - {1} of {2}'}), dockedItems: [ { xtype: 'toolbar', items: [ { text: 'Add', handler: function () { storeGridBarCode.insert(0, new BarCode()); rowEditing.startEdit(0, 0); }}, '-', { itemId: 'delete', text: 'Delete', disabled: true, handler: function () { var selection = PanelGridBarCode.getView().getSelectionModel().getSelection()[0]; if (selection) { storeGridBarCode.remove(selection); } } } ] } ] }); PanelGridBarCode.getSelectionModel().on('selectionchange', function (selModel, selections) { PanelGridBarCode.down('#delete').setDisabled(selections.length === 0); }); //Сохранение: storeGridBarCode.getProxy().url = "Handlers/..."; //Меняем УРЛ //Параметры Шапки store.proxy.extraParams.ParamTextField01 = "XXX01"; store.proxy.extraParams.ParamTextField02 = "XXX02"; storeGridBarCode.sync({ ... }); Под 4.0.7 - отсылаются на Сервер все данные сразу, кроме приёма клиентом ответа с сервера ((( Под 4.1.0 - есть приём клиентом ответа с сервера, но отсылаются на Сервер данные по частям ((( 4.1.0: <script type="text/javascript" src='http://dev.sencha.com/deploy/ext-4.1.0-gpl/ext-all.js'></script> <link rel="stylesheet" href="http://dev.sencha.com/deploy/ext-4.1.0-gpl/resources/css/ext-all.css" /> |
Цитата:
Цитата:
Ext.onReady(function() { if(window.console && console.clear) console.clear(); if(window.console && console.log) console.log("core: %s, extjs: %s", Ext.versions.core.version, Ext.versions.extjs.version); var extraParamField = Ext.create("Ext.form.field.Text", { value: "extraParamValue" }), store = Ext.create("Ext.data.Store", { fields: [ { name: "id", type: "int" }, "name" ], proxy: { type: "ajax", url: "handler.ashx" }, listeners: { beforesync: function(options, eOpts) { this.getProxy().extraParams = { extraParamValue: extraParamField.getValue() }; } }, data: [ { id: 1, name: "Record# 1" }, { id: 2, name: "Record# 2" }, { id: 3, name: "Record# 3" }, { id: 4, name: "Record# 4" } ] }), grid = Ext.create("Ext.grid.Panel", { store: store, columns: [ { dataIndex: "id", header: "id", editor: { xtype: "numberfield" }, flex: 1 }, { dataIndex: "name", header: "name", editor: { xtype: "textfield" }, flex: 1 } ], plugins: [ Ext.create("Ext.grid.plugin.CellEditing", { clicksToEdit: 2 }) ], tbar: [{ text: "Add", handler: function(btn, e) { store.add(Ext.create(store.getProxy().getModel(), { name: "blah-blah-blah" })); } }, { text: "Del", handler: function(btn, e) { var grid, sm, sel; if(!(grid=btn.up("grid")) || !(sm=grid.getSelectionModel()) || !(sel=sm.selected) || !sm.hasSelection()) return; store.remove(sel.items); } }, { text: "Save", handler: function(btn, t) { store.sync(); } }, extraParamField ], renderTo: Ext.getBody() }); }); Удаляем + редактируем + добавляем, а затем - сохраняем. В Firebug'е видим - 3 (три) запроса. Что я делаю не так? |
Часовой пояс GMT +3, время: 08:11. |