сервер и 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} }); |
Очень хороший совет - не используйте нативные 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 Попробуйте использовать эти советы и напишите если не получится. |
Спасибо за дельные советы!
Наверное эта Сенча мне не поможет - виноват, не уточнил: мы используем 3 версию Экста. А в сравнении с четвёртой там есть различия. Цитата:
Ещё можно найти радиокнопку, используя в listeners событие afterlayout. Но тогда я не могу знать что пришло с сервера! То есть проверку if (action.result.data.p0442_c06==1) - сделать не удастся. Но кнопка проставится правда..... Как же быть? Второй день ничего путного не придумаю. |
Создать новое поле в классе, записать туда пришедшие данные, на afterlayout прочитать их и действовать по необходимой логике.
Что-то вроде this.lastAction = action.type , а потом в afterlayout if (this.lastAction == 'load'){ ... |
Цитата:
|
maksimka2112,
Да да, именно там. |
вы похоже store.load() вызываете до того как вызываете render.. а судя по логике вашего обработчика 'actioncomplete' на сторе должно быть наоборот
|
Цитата:
Цитата:
Так как у меня таб панель, то второй вкладке задую такие параметры: 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. |