Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Передача данных полученных из grid на сервер (https://javascript.ru/forum/extjs/21031-peredacha-dannykh-poluchennykh-iz-grid-na-server.html)

xalt 26.08.2011 14:09

Передача данных полученных из grid на сервер
 
Добрый день.
Возникла трудность с пониманием того, как передать данные store на сервер. Т.е. есть grid таблица куда загружаются данные из store. Я делаю какие-то изменения в таблице, и хочу отправить все данные из таблицы на сервер. Вопрос как передать эти данные? Верней вопрос как перевести объект store в нужный вид для отправки через ajax?
В контроллере есть код:
init: function() {
        this.control({
            'viewport button': {
                click: this.savedata
            }
        });
    },
    
    savedata: function(grid, record){
            console.log('Save');
            var vl_store = this.getGamesStore();
            
            var vl_ajax = Ext.Ajax.request({
                url: '/sport/jsontoserver.php',
                method: 'post',
                params: {
                    vl_store: vl_store
                },
                success: function(response){
                    var text = response.responseText;
                }
            });

    }

B@rmaley.e><e 28.08.2011 14:48

http://ru.wikipedia.org/wiki/JSON

xalt 29.08.2011 01:50

В этом и вопрос был, как получить JSON строку из store, чтобы потом отправить её на сервер.

В принципе, придумал вот так сделать:
init: function() {
        this.control({
            'viewport  button': {
                click: this.savedata
            }
        });
    },
    
    savedata: function(){
            var store = this.getGamesStore();
            var store_count = store.data.length;
            //формируем json строку
            var json_to_server = '[';
            store.each(function(item, index) {
                //не ставим запятую, если элемент в массиве последний
                json_to_server += index==store_count-1 ? Ext.encode(item.data) : Ext.encode(item.data) + ', ';
            });
            json_to_server += ']';
            
            //vl_store.load(); // можно применить для первой загрузки данных в грид
            
            var ajax = Ext.Ajax.request({
                url: '/sport/jsontoserver.php',
                method: 'post',
                params: {'json' : json_to_server},
                success: function(response){
                    var text = response.responseText;
                }
            });

    }

Но кажется как-то громоздко. И думаю в ext как-то должно делаться это в одну пару строк. :)

likhter 02.09.2011 10:03

Если все данные пучком, то можно так
var data = [];
store.each(function(item) {
  data.push(item.data);
)};
var json = Ext.encode(data);


Если по одному (к примеру, сразу после добавлении записи в таблицу), то вам стоит посмотреть Ext.data.DataWriter и его применение со Ext.data.Store (к примеру, JsonStore)

xalt 02.09.2011 12:12

Цитата:

Сообщение от likhter (Сообщение 124256)
Если все данные пучком, то можно так
var data = [];
store.each(function(item) {
  data.push(item.data);
)};
var json = Ext.encode(data);


Если по одному (к примеру, сразу после добавлении записи в таблицу), то вам стоит посмотреть Ext.data.DataWriter и его применение со Ext.data.Store (к примеру, JsonStore)

Да, такой вариант подходит.
Т.е. создается массив объектов, а потом он целиком енкодится в json строку. Я думал енкод нельзя применять к массиву объектов.
Спасибо за совет, код упростился.

freeExec 22.09.2011 10:41

Что мне в данном примере не нравится так это то, что это Array. И в месте с ним передаются и его функции. По-дефолту эта функция "remove" и с ней проблем не возникает. Но если добавить библиотеку Ext.ux.util.js, то в ней дополняются функции для Array и теперь и они тоже передаются на сервер. Проблема в том, что там в коде есть знак больше (<) на которую ASP.net ругается как попытку передать ему ява-скрипт. Хотя там и есть возможность отключить эту проверку, но естественно не желательно.
Поэтому я использую не массив, а объект.
var data = {}; // - Object
var i = 0;
sm.each(function (item){
data[i++] = (Ext.encode({
ins: item.get('ИНС'),
pa: item.get('ПА')
}))
});


Часовой пояс GMT +3, время: 21:17.