Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   сервер и radiogroup (https://javascript.ru/forum/extjs/49329-server-i-radiogroup.html)

maksimka2112 07.08.2014 19:25

сервер и radiogroup
 
При загрузке формы с сервера не могу проставить радиоточку. Форма загружена в tab panel. Собственно по примеру кода всё будет ясно:

var chxs = {columnWidth: .25,
    layout: 'form',
    labelAlign: 'top',
    items: [
        {
        xtype: 'radiogroup',
        fieldLabel: 'Техническое обоснование формировать',
        items: [
            {
            boxLabel: 'приложение',
            name: 'p0442_c06',
            inputValue: 1
            },
            {
            boxLabel: 'оборотная сторона',
            id: 'gf',
            name: 'p0442_c06',
            inputValue: 0
            }
        ]
    }]
};

    panel2 = new Ext.FormPanel({
        frame: true,
        layout: 'form',
        title: "<span id=tehob >Техническое обоснование",
	autoWidth: document.body.clientWidth*0.9, height: document.body.clientHeight*0.9,
	id: 'tehobId',
/*----------------------------------------------------------------------------*/
    url: 'phps/mm160c06_load.php',
    reader: new Ext.data.JsonReader({
    	root: 'dan',
    	totalProperty: 'total',
	id: "id1"
	}, [
	'p0442_c06'
	]
    ),
    writer: new Ext.data.JsonWriter({
        encode: true,
        writeAllFields: true
    }),
    items: [
    {
        bodyStyle: {
            margin: '0px 0px 5px 0px'
        },
        hideBorders: true,
        items:[{
            hideBorders: true,
            layout: 'column',
            items: [chxs]
        }]
    }]
	listeners: { 
            'actioncomplete': { fn: function(form, action){
            var p044_chk=document.getElementsByName('p0442_c06');
            if (action.type=='load'){
                    if (action.result.data.p0442_c06==1){ // РЕЗУЛЬТАТ С СЕРВЕРА
                        var p044_chk=document.getElementsByName('p0442_c06'); // НЕ НАХОДИТ!! НО! - ЕСЛИ СДЕЛАТЬ SETTIMEOUT, ТО ВСЁ РАБОТАЕТ. ИЛИ ЕСЛИ СДЕЛАТЬ ВМЕСТО ACTIONCOMPLETE - AFTERLAYOUT, ВСЁ РАБОТАЕТ. ПРАВДА НЕ ВИДИТ ОТВЕТ С СЕРВЕРА.....(action.result.data.p0442_c06)
                                document.getElementsByName('p0442_c06')[0].checked=true;
                    }else{
                                document.getElementsByName('p0442_c06')[1].checked=true;
                    }
            }
            }, scope: this, single: true }
	}
    });



panel2.load({
    method: 'post', params: {c155: c155}
});

Raydezm 08.08.2014 19:11

Очень хороший совет - не используйте нативные getElementsByName и прочее.
http://docs.sencha.com/extjs/4.2.2/#...ComponentQuery
Ну или под любую другую версию, отличий почти нет.
Или методы down и up, например panel2.down('[name="p0442_c06"]').

Второй совет, который спасет вас от багов асинхронной загрузки и вообще сделает жизнь теплее и мягче - не используйте new.
Вместо этого используйте Ext.create().

А вот метод который установит значение для ваших радиокнопок - http://docs.sencha.com/extjs/4.2.2/#...ethod-setValue

Попробуйте использовать эти советы и напишите если не получится.

maksimka2112 08.08.2014 20:18

Спасибо за дельные советы!

Наверное эта Сенча мне не поможет - виноват, не уточнил: мы используем 3 версию Экста. А в сравнении с четвёртой там есть различия.

Цитата:

Сообщение от Raydezm (Сообщение 324986)
А вот метод который установит значение для ваших радиокнопок - http://docs.sencha.com/extjs/4.2.2/#...ethod-setValue

Вы мне советуете использовать setValue...но проблема ни в этом. Проблема в том, что я не могу найти радиокнопку! Точнее, я её могу найти, используя setTimeout и поставив 5000, например. Документ загрузится и всё хорошо. Но это же ни есть хорошо, ибо время ответа с сервера всегда разное и документ грузится с разной скоростью....

Ещё можно найти радиокнопку, используя в listeners событие afterlayout. Но тогда я не могу знать что пришло с сервера! То есть проверку if (action.result.data.p0442_c06==1) - сделать не удастся.
Но кнопка проставится правда.....

Как же быть? Второй день ничего путного не придумаю.

Raydezm 08.08.2014 23:18

Создать новое поле в классе, записать туда пришедшие данные, на afterlayout прочитать их и действовать по необходимой логике.

Что-то вроде

this.lastAction = action.type

, а потом в afterlayout

if (this.lastAction == 'load'){ ...

maksimka2112 09.08.2014 00:42

Цитата:

Сообщение от Raydezm (Сообщение 325006)
this.lastAction = action.type

Это в actioncomplete писать?.. или где?.. что-то я никак не въеду

Raydezm 09.08.2014 01:30

maksimka2112,
Да да, именно там.

siber-biber 11.08.2014 07:00

вы похоже store.load() вызываете до того как вызываете render.. а судя по логике вашего обработчика 'actioncomplete' на сторе должно быть наоборот

maksimka2112 14.08.2014 18:18

Цитата:

Сообщение от siber-biber (Сообщение 325273)
вы похоже store.load() вызываете до того как вызываете render.. а судя по логике вашего обработчика 'actioncomplete' на сторе должно быть наоборот

а я как бы форму гружу, сторе персонально не идентифицирую...

Цитата:

Сообщение от Raydezm (Сообщение 325006)
Создать новое поле в классе, записать туда пришедшие данные, на afterlayout прочитать их и действовать по необходимой логике.

Что-то вроде

this.lastAction = action.type

, а потом в afterlayout

if (this.lastAction == 'load'){ ...

Большое спасибо! Ваш совет помог. Я вот как сделал:

Так как у меня таб панель, то второй вкладке задую такие параметры:
disabled: true,
	id: 'tehobId',

Далее прописываю события для данной вкладки:
'actioncomplete': { fn: function(form, action){
            var p044_chk=document.getElementsByName('p0442_c06');
            if (action.type=='load'){
                Ext.getCmp('tehobId').enable();
                    if (action.result.data.p0442_c06==1){
                        this.lastAction = 'goodLoad';
                    }else{
                        this.lastAction = 'badLoad';
                    }
            }
            
            }, scope: this, single: true },
            'afterlayout': { fn: function(form, action){
                if (this.lastAction == 'goodLoad'){
                    document.getElementsByName('p0442_c06')[0].checked=true;
                }
                if (this.lastAction == 'badLoad'){
                    document.getElementsByName('p0442_c06')[1].checked=true;
                }
            }, scope: this, single: true}


И напоследок на всякий случай (мало ли - ответ с сервера не придёт или ещё что) делаю активной вкладку:
setTimeout(function() {
Ext.getCmp('tehobId').enable();
},6500);


Как-то так. Может не совсем всё правильно. Но вроде работает.


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