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

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Все. Вопрос решен.
Сделал на основе кастом контролов. Так проще создавать контролы
 

Мыш

Lotus Team
12.02.2008
1 224
29
BIT
103
NickProstoNick, не расскажете поподробнее, как решили? У меня похожая задача назревает, собираю инфу... А уроды-индусы про одну из самых главных вкусняшек XPages старательно умалчивают. :-(
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
да-да...
Ну так вот.. задача - сделать опросник.
Один вопрос на страницу, но варианты ответа - разные...чекбокс, комбобокс, радиобаттон, редактируемое поле. Причем возможны комбинации
чекбокс/комбобокс + редактируемое поле, несколько редактируемых полей и т.д.

Неоднократно поступала идея накидать компонент да и все.
Самые простые задачи можно решить при помощи Include Page.
Но простым накидыванием компонент решить сложновато. Страница будет перегружена и разбирать ошибки потом - проблема.. да и хайдить все эти конструкции...

По этому решил копать в сторону динамического создания компонент.
Свел все к тому, что в дизайнере создается нужный кастом контрол и после динамически создаю этот контрол.
Вот код
Данные передаю через переменные viewscope
 
A

alexas

Nick, с Dojo компонентами (в отличии от Core) все-же можно работать.
XML:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Радио кнопки "On the Fly" в панели</div></div><div class="sp-body"><div class="sp-content">
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:br></xp:br>
 
<xp:button value="test DojoRadio" id="button3">
<xp:eventHandler event="onclick" submit="true"
refreshMode="complete">
<xp:this.action><![CDATA[#{java script:var panelcontainer = getComponent("main");
//чистим контейнер
if (panelcontainer.getChildren().size() > 0) {
panelcontainer.getChildren().clear();
}
 
var djRadio = new com.ibm.xsp.extlib.component.dojo.form.UIDojoRadioButton();
var djRadio1 = new com.ibm.xsp.extlib.component.dojo.form.UIDojoRadioButton();
 
djRadio.setTitle("RadioID1");
djRadio.setId("RadioID");
djRadio.setGroupName("GroupName1");
djRadio.setDefaultValue("Value");
djRadio.setValue("Value");
djRadio.setLabel("Label-1");
 
djRadio1.setValue("Value1");
djRadio1.setLabel("Label-2");
djRadio1.setGroupName("GroupName1");
 
panelcontainer.getChildren().add(djRadio);
panelcontainer.getChildren().add(djRadio1)}]]></xp:this.action>
</xp:eventHandler>
</xp:button>
<xp:br></xp:br>
<xp:br></xp:br>
<xp:panel id="main" style="background-color:rgb(255,255,128)"></xp:panel></xp:view>

Спасибо за идеи.
P.S. До кучи:
 
Последнее редактирование:

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
В общем вот что получилось
254.jpg
Каждый выделенный блок - это отдельный документ и кастом контрол.
Юниды документов передаются через название компонента, тем самым нет мусора в Scope-переменных.
Одно что не нравится - проверка полей. Валидатор сбрасывает значение из всех полей если ошибка допущена хотя бы в одном поле.
Приходится выбирать значения снова
 
A

alexas

...Одно что не нравится - проверка полей. Валидатор сбрасывает значение из всех ...
Я бы, наверное, проверял значение всех радио одновременно.
1 При каждом изменении. И по результату - скрывать/показывать кнопку "Дальше".
2 Или при нажатии кнопки "Дальше" - сообщение, если хотя-бы одна радио пустая.
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
проверяю я стандартным валидатором. Иначе за ранее не известно сколько будет датасорсов.
И не совсем понятно как эти датасорсы перебирать... хотя конечно можно попробовать... но это будет вторая итерация :(

Ладно.. с датасорсами разобрался.
Но вот не могу получить компонент из сабформы и поменять ему значение.
метод getComponent("elementName") не подходит... т.к. по сути у меня на странице может быть несколько компонент elementName.
 
A

alexas

... на странице может быть несколько компонент elementName...
Имя компонента/контрола может быть вычисляемым. Это поможет сделать его уникальным.
Например так - Name: MyRadio_${VariableValue}.
Только в Properties формулу прописать дизайнер не даст - надо в тексте Sourse руками (т.е. <xp:radioGroupid id="MyRadio_${VariableValue}">)
В частном случае, бывает удобно для доступа к контролам, размноженным в репитере. Например так - Name: MyControl_${RepeaterIndex} (RepeaterIndex - indexVar репитера).
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Имя компонента/контрола может быть вычисляемым. Это поможет сделать его уникальным.
Например так - Name: MyRadio_${VariableValue}.
Только в Properties формулу прописать дизайнер не даст - надо в тексте Sourse руками (т.е. <xp:radioGroupid id="MyRadio_${VariableValue}">)
В частном случае, бывает удобно для доступа к контролам, размноженным в репитере. Например так - Name: MyControl_${RepeaterIndex} (RepeaterIndex - indexVar репитера).
У меня нет репитера.

Есть вот такой вот метод (работает)
JavaScript:
var cc:com.ibm.xsp.component.UIIncludeComposite = getComponent(myCC);
var msg = cc.findComponent("computedField1")
_dump( msg.getValue() )
Но вот поменять значение - не получается :)

Прошу прощения.. тупанул... совсем забыл что страница перерисовывается постоянно.
Исправил это нелепое недоразумение :)
Все гуд
 
Последнее редактирование модератором:

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Продолжаю экспериментировать... сейчас уже с диалогами.
Диалог подгружаются, но есть момент - не работают стили :(
Нужно такой
257.jpg
А получаю такой :(
258.jpg

Решается это "подкидыванием" ненужного диалога на форму, чтоб распарсилось dojo.
Как это решить без ненужного диалога?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!