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 (три) запроса. Что я делаю не так? |
Ex_Soft,
Цитата:
То есть, у Вас "не получается" передать на сервер все записи грида +параметры полей одним запросом, вне зависимости от того что с ними делал Юзер или вообще ничего не делал ??? Если "Да", то: У меня большой проект на АСПе, я прикручиваю к нему, по чуть-чуть возможности Экс-а. Так, что весь солюшн не вышлю ... но могу вырезать из него код Грида и впихнуть в новый солюшн и Выслать Вам ??? П.С. Firebug'е не пользуюсь: Хром и ИЕ только, больше нравятся. |
Цитата:
Цитата:
А насчет Цитата:
Цитата:
[off] А насчет регалий - не переймайтесь. Здесь их раздают автоматом со всеми вытекающими... Так что Вы скоро и Профессором станете... [/off] |
submit textfield + grid in ExtJS:
buttons: [
handler:
function () {
//Читаем Грид, и не надо никаких Сторе.Синк или Сторе.Сейв
var records = [];
storeGridBarCode.data.each(function (rec) {
records.push(rec.data);
});
Panel.submit(
{
waitMsg: "Loading...", //not in 4.1.0 - хрен его знает почему ???
params: {
action: 'update', //Можно убрать.
par1: Ext.encode(records) //par1 содержит JSON Грида
},
url: ...
success: ...
failure: ...
});
C#
[Serializable]
public class DirElement
{
public int? DirID;
public string DirName;
}
...
JavaScriptSerializer serializer = new JavaScriptSerializer();
DirElement[] _DW = serializer.Deserialize<DirElement[]>(par1);
...
П.С. Ex_Soft, Цитата:
П.С.2 Может кому пригодится, а может пригодится даже Вам, уважаемый Ex_Soft. П.С.3 Вы мне очень многим помогли,... и я надеюсь у нас нет "обид" ??? |
| Часовой пояс GMT +3, время: 08:27. |