Динамическое Создание Компонент

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 790
42
#1
Всем привет!
Интересует вопрос динамического создания компонент так как это делает Repeat control с одной разницей - мне надо работать с массивом, а не видом.
Кто-то реализовывал такое?
 

alexas

Well-Known Member
10.06.2009
214
0
#2
Так RepeatСontrol и работает с массивом. Походу ему все равно, что съедать.

Я рисую динамические таблички RepeatСontrol-ом в RepeatСontrol-е: цифирьки, картинки, кнопочки в ячейках.
Данные беру из массивов подготовленных в полях.
В помощь доступа к элементам массивов - Index RepeatСontrol-ский.
Не то?
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 790
42
#3
Так RepeatСontrol и работает с массивом. Походу ему все равно, что съедать.

Я рисую динамические таблички RepeatСontrol-ом в RepeatСontrol-е: цифирьки, картинки, кнопочки в ячейках.
Данные беру из массивов подготовленных в полях.
В помощь доступа к элементам массивов - Index RepeatСontrol-ский.
Не то?
Ла. То. Я уже тоже разобрался, но не успел отписать.
Кстати, для доступа к данным репитера не использую никаких индексов. Просто пишу имя коллекции репитера
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 790
42
#5
Но тут еще один нюанс, который усложняет жизнь.
В этих динамических компонентах должны быть разные значения.
Конкретней - меня интересуют компоненты свозможностью выбора (чекбоксы, радибаттоны и т.д. )
Получить в итоге нужно такое. Один нюанс - на скрине варианты ответа разные, просто лень писать было
252.jpg
 

alexas

Well-Known Member
10.06.2009
214
0
#6
Похожее проходил, если Вас правильно понял.
На OnClick (у меня были кнопки) по индексу репитера менял соответсвующее значение массива-источника (У Вас на OnChange).
Типа запоминал действие - нажатие на кнопку. Для Вашего случая - чекбокс.
Для двух других случаев можно попробовать сделать аналогично - запоминать в массиве-источнике индекс радиобатона или листбокса.
Понятно написал?
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 790
42
#7
Не очень понятно.
Но может и я не очень понятно выразился.

С набором данных для компонент уже разобрался.

Что мне нужно - на странице разный набор разных компонент. Компоненты должны создаваться динамически.

Как пробовал сделать: на странице разместил панель, репитер, компютед поле и компьютед страницу
253.jpg

Компьютед страница - это кастом контрол.

Проблема вот какого характора - Компьютед страница создается до того как начнет работать репитер. Потому динамически менять компьтед страницу не получится :(
И как быть - не представляю :(


Очередной глупый вопрос - как на SSJS удалить все дочерние компоненты из панели?
 

alexas

Well-Known Member
10.06.2009
214
0
#8
Хотелку вроде уразумел. Так не делал, а нотус сейчас далеко - отдыхаю. Сорри :(
До чего додумаетесь, дайте знать. OK? Ценная задача!
 

Darkhan

Well-Known Member
Lotus team
14.12.2012
98
4
#9
Если элемент массива репитера какой-нибудь "свой" объект (bean), то можно скрывать (rendered) ненужные компоненты внутри репитера используя булевое свойство объекта репитера. Типа этого:
Код:
<xp:repeat id="myRepeat" value="#{your_array}" var="element">

<xp:some_component0 id="sc0" rendered="#{element.sc0Visible}" /> 
<xp:some_component1 id="sc1" rendered="#{element.sc1Visible}" />

</xp:repeat>
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 790
42
#10
Если элемент массива репитера какой-нибудь "свой" объект (bean), то можно скрывать (rendered) ненужные компоненты внутри репитера используя булевое свойство объекта репитера. Типа этого:
Код:
<xp:repeat id="myRepeat" value="#{your_array}" var="element">

<xp:some_component0 id="sc0" rendered="#{element.sc0Visible}" /> 
<xp:some_component1 id="sc1" rendered="#{element.sc1Visible}" />

</xp:repeat>
Это самое простое решение, но страница будет нагружена (в плане код)... разбираться потом будет сложно.
Сейчас у меня получается подгружать страницу (кастом контрол) динамически без перезагрузки страницы.
Если использовать репитер - возникает проблема, в каждой новой строке повторяются компоненты из предыдущих строк.
Вот решу как быть - отпишусь
 

Darkhan

Well-Known Member
Lotus team
14.12.2012
98
4
#11
Так можно заюзать property definition кастом контроля, для передачи параметров скрытия
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 790
42
#12
Дело в том, что один и тот же компонент может повторяться несколько раз.
Вот код динамического добавления кастом контрола, где Name имя контрола в формате name.xsp, index - имя родительского компонента на странице:
JavaScript:
function loadCC(Name:String, index: String){
//get panel control as parent of the custom control to include
var objParent = getComponent(index);
 
 
//page name of the custom control to include
var strPageName = "/" + Name;
 
//create new UIIncludeComposite
var objControl = new com.ibm.xsp.component.UIIncludeComposite();
 
//set the page name to the UIIncludeComposite object
objControl.setPageName(strPageName);
 
 
//Ensure a unique id for this control
objControl.setId("new_" + @Unique());
 
//Create a builder object from XPages Extension Library
var objBuilder = new com.ibm.xsp.extlib.builder.ControlBuilder();
 
//to use the builder you need ControlImpl objects.
//Because this builder only can work with those objects
//get the class of ControlImpl
var classControlImpl = objBuilder.getClass().getDeclaredClasses()[1];
 
//create an ControlImpl object of the parent panel
var objImplParent = new classControlImpl(objParent);
 
//create an ControlImpl object of the custom control
var objImplControl = new classControlImpl(objControl);
 
//add the new custom control to the parent
objImplParent.addChild(objImplControl);
 
//build the updated parent control
objBuilder.buildControl(facesContext,objImplParent,false);
}
Остается вопрос привязки контрола к данным
 
Последнее редактирование модератором:

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 790
42
#14
да, не плохо... но блин никто не описывает как добавить данные для выбора :(
мда... хелп вообще никакой :(
 

Мыш

Well-Known Member
Lotus team
12.02.2008
1 087
13
#15
да, не плохо... но блин никто не описывает как добавить данные для выбора
Есть метод setText - устанавливает визуально отображаемый текст, скажем, для radiobutton (совпадает ли он с сохраняемым значением - хз). Вообще, можно нарисовать нужный элемент вручную, затем получить его программно через getComponent и поизучать его свойства через всякие get-методы... В общем, методом научного тыка...
Код:
var radio1: com.ibm.xsp.component.xp.XspInputRadio = getComponent("RadioID");
var st = radio1.getText();
view.postScript("alert(" + st + ");");
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 790
42
#16
Есть метод setText - устанавливает визуально отображаемый текст, скажем, для radiobutton (совпадает ли он с сохраняемым значением - хз). Вообще, можно нарисовать нужный элемент вручную, затем получить его программно через getComponent и поизучать его свойства через всякие get-методы... В общем, методом научного тыка...
Код:
var radio1: com.ibm.xsp.component.xp.XspInputRadio = getComponent("RadioID");
var st = radio1.getText();
view.postScript("alert(" + st + ");");
Вот вот :( а на тыканья времени нет :( но похоже придется.
А всего-то надо добавить значения для выбора
 

Мыш

Well-Known Member
Lotus team
12.02.2008
1 087
13
#17
А если заюзать исходный java-код для статически созданного элемента? Дизайнер, вроде, сохраняет код в файлах на диске...
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 790
42
#18
разобрался... Хотя возможно не правильно
JavaScript:
var RadioGroup:com.ibm.xsp.component.xp.XspSelectOneRadio = new com.ibm.xsp.component.xp.XspSelectOneRadio();
RadioGroup.setId("RadioID");
 
var attr:com.ibm.xsp.complex.Attr = new com.ibm.xsp.complex.Attr("class", "xspRadioButton");
var list:java.util.ArrayList = new java.util.ArrayList();
list.add(attr);
RadioGroup.addAttr(attr);
 
var radio:com.ibm.xsp.component.xp.XspInputRadio = new com.ibm.xsp.component.xp.XspInputRadio();
radio.setText("123")
radio.setId("RadioID")
 
var radio2:com.ibm.xsp.component.xp.XspInputRadio = new com.ibm.xsp.component.xp.XspInputRadio();
radio2.setText("456")
radio2.setId("RadioID")
 
var panelcontainer = getComponent( 'main' );
panelcontainer.getChildren().add( RadioGroup );
RadioGroup.getChildren().add(radio)
RadioGroup.getChildren().add(radio2)
но все равно есть проблема :( радиобаттоны не рисуются в родительском контейнере :(
 
Последнее редактирование модератором:

Мыш

Well-Known Member
Lotus team
12.02.2008
1 087
13
#19
Хммм... Вообще не рисуются? У мну (код в кнопке, проверяю на клиенте Notes) рисуются, но после них добавляется какая-то левая рамка шириной во всю страницу.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 790
42
#20
Хммм... Вообще не рисуются? У мну (код в кнопке, проверяю на клиенте Notes) рисуются, но после них добавляется какая-то левая рамка шириной во всю страницу.
Рисуются.
Эта рамка и есть радиогруппа. Компоненты должны бы рисоваться в ней.
Возможно я не правильно "рисую" компоненты