Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Заполнить несколько ComboBox одним запросом! (https://javascript.ru/forum/extjs/29524-zapolnit-neskolko-combobox-odnim-zaprosom.html)

potkin 01.07.2012 23:56

Заполнить несколько ComboBox одним запросом!
 
Продолжение
Как это сделать: ТЫЦЬ для 2-го Экса.

Я запнулся на формате передаваемых данных с сервера для:
1.
comboBoxStore = new Ext.data.JsonStore({
 fields: [...],
        proxy: {
            type: 'ajax',
            url: "Handlers/ХХХ.ashx",
            reader: {
                type: "json",
                root: "Table1"
            }
        }
    }); comboBoxStore.load();

Формат данных, только такой:
Код:

{'success':true, 'total':1, 'Table1': [{"Table1ID":"1","Table1Name":"шт","Table1Desc":"Одна штука"}]}
Тут всё супер работает.

2)
dataStore - первое хранилище
digitStore - второе хранилище
........
comboStoreRequest = Ext.Ajax.request({
    url: "Handlers/ХХХ.ashx",
    success: function(result){
        //Преобразуем JSON-ответ в объект
        comboStore = Ext.util.JSON.decode(result.responseText);
        //Загрузим массив данных первое хранилище
        dataStore.loadData(comboStore.data);
        //Загрузим массив данных во второе хранилище
        digitStore.loadData(comboStore.digit);
    },
    //Метод
    method: 'POST',
    //Параметры вызова
    params: {act : 'get_data'}
});

Формат данных, только такой:
Код:

[["1","шт","Одна штука"],[2, "шт2", "Одна штука2"],[3, ..., ...], ...]
Если я правильно понял ...

Может кто пробовал ???

ASP.NET:

Для первого варианта делаю так:
List<object> list = new List<object>();
var data = new { Table1ID = dr[0].ToString(), Table1Name = dr[1].ToString(), Table1Desc = dr[2].ToString() };

JavaScriptSerializer serializer = new JavaScriptSerializer();
output = "{" + string.Format("'success':true, 'total':" + RecCount + ", 'Table1': [{0}]", string.Join(",", list.ConvertAll<string>(serializer.Serialize).ToArray())) + "}";


И как во втором случае в ASP.NET сформировать такой массив данных ???

Ex_Soft 02.07.2012 10:38

Цитата:

Сообщение от potkin (Сообщение 185743)
Формат данных, только такой:
Код:

[["1","шт","Одна штука"],[2, "шт2", "Одна штука2"],[3, ..., ...], ...]
Если я правильно понял ...

Не правильно
Код:

var
        store = Ext.create("Ext.data.Store", {
                fields: [
                        { name: "id", type: "int" },
                        "name"
                ]
        }),
        data = [
                { id: 1, name: "Record# 1" },
                { id: 2, name: "Record# 2" },
                { id: 3, name: "Record# 3" },
                { id: 4, name: "Record# 4" }
        ];

store.loadData(data);


DjDiablo 02.07.2012 18:30

Цитата:

Не правильно
в демке сделано так.
mydata =
    [
        [1, 'John', 'Smith'],
        [2, 'Fred', 'Jones']
    ];
store.loadData(mydata, false);


Для формирования массива arrayList должен подойти вроде.
ArrayList a;
    ArrayList b = new ArrayList();

    // заполнение
    a = new ArrayList();
    a.Add(1);
    a.Add("John");
    a.Add("Smith");

     b.Add(a);

Ex_Soft 02.07.2012 21:52

Цитата:

Сообщение от DjDiablo (Сообщение 185868)
в демке сделано так.

И шо?
Цитата:

Сообщение от DjDiablo (Сообщение 185868)
Для формирования массива arrayList должен подойти вроде

Насколько я понял у ТС проблема с выбором подходящего контейнера для последующей сериализации его в "обязательный" [ [ ], [ ], [ ] ]

potkin 05.07.2012 16:27

Ok, спасибо за ответы, будем пробовать )))

П.С. А, всё так, кто-то пробовал уже, одним "запросом" несколько Комбов заполнять данными ???

DjDiablo 05.07.2012 21:39

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

Однако принцип работы в отличии от предложенного в вашем примере, совершенно иной.
По условию задачи у меня есть форма, внутри формы есть гриды и dataview и мне их надо как то заполнять.
Решение реализовал на основании ассоциаций,

Суть в том что,главная модель имеет ассоциации hasMone с другими моделями. Ассоциированные hasmony модели, как известно хранятся в сторе, вот этот сторе я и передаю гриду. В примере заполняются два грида, но я могу сделать 50 ассоциаций и заполнить 50 гридов, или комбобоксов, или чёнидь ещё. И всё это собственно произойдёт одним запросом. С сохранением кстатии тоже нет проблем, я его так же могу производить одним запросом .

Вот Упрощённая демка, на которой я ставил эксперементы. Здесь к примеру я заполнил два грида.
Рабочий пример во вложении.

Ext.require([
    'Ext.data.*',
    'Ext.panel.Panel',
]);
	

Ext.onReady(function() {
        //модель для первого грида
	Ext.define('Group2', {
	    extend: 'Ext.data.Model',
	    fields: ['id', 'parent_id', 'name'],	
        });

        //модель для второго грида
	Ext.define('Group3', {
	    extend: 'Ext.data.Model',
	    fields: ['id', 'parent_id', 'name'],	
        });


       // главная модель,
	Ext.define('Group', {
	    extend: 'Ext.data.Model',
            // у меня здесь данные для полей в форме, но в данном примере они не нужны
	    fields: ['id', 'parent_id', 'name'],
	    proxy: {
	        type: 'ajax',
	        url: 'data.json',
	        reader: {
	            type: 'json',
	            root: 'groups'
	        }
	    },
	    associations: [{
                //ассоциация сформирует сторе для 1го грида
		type: 'hasMany',
		model: 'Group2',  	        
		primaryKey: 'id',
		foreignKey: 'parent_id',
		associationKey: 'child_groups' // read child data from child_groups
	    },{
                //ассоциация сформирует сторе для 2го грида
		type: 'hasMany',
		model: 'Group3',  	        
		primaryKey: 'id',
		foreignKey: 'parent_id',
		associationKey: 'child_groups2' // read child data from child_groups
	    }]
        });

        //=======================================================================//
	
	Group.load(2,{
	        success: function(group){
                        //выведем всю модель в консоль, чтобы её можно было поизучать
			console.log(group);

			group.group2s().each(function(rec){
				console.log(rec.get('name'));
			});

			Ext.create('Ext.grid.Panel', {
			    title: 'Users',
			    store: group.group2sStore,
			    columns: [
			        { header: 'id',  dataIndex: 'id' },
			        { header: 'name',  dataIndex: 'name' }
			    ],
			    height: 200,
			    width: 400,
			    renderTo: Ext.getBody()
			});


			Ext.create('Ext.grid.Panel', {
			    title: 'Users',
			    store: group.group3sStore,
			    columns: [
			        { header: 'id',  dataIndex: 'id' },
			        { header: 'name',  dataIndex: 'name' }
			    ],
			    height: 200,
			    width: 400,
			    renderTo: Ext.getBody()
			});

		}
	});		
});


//образец данных
{
    "success":true,
    "groups": {
        "id": 10,
        "parent_id": 100,
        "name": "Main Group",
        "parent_group": {
            "id": 100,
            "parent_id": null,
            "name": "Parent Group"
        },
        "child_groups": [
		{
	            "id": 2,
	            "parent_id": 10,
	            "name": "Child Group 1"
	        },{
	            "id": 3,
	            "parent_id": 10,
	            "name": "Child Group 2"
	        },{
	            "id": 4,
	            "parent_id": 10,
	            "name": "Child Group 3"
	        }
	],

        "child_groups2": [
		{
	            "id": 2,
	            "parent_id": 10,
	            "name": "Child Group 111"
	        },{
	            "id": 3,
	            "parent_id": 10,
	            "name": "Child Group 2222"
	        },{
	            "id": 4,
	            "parent_id": 10,
	            "name": "Child Group 3333"
	        }
	]
    }
}

potkin 05.07.2012 22:57

DjDiablo,
О !!! Класс )))
Большое спасибо, будем пробовать !!!


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