• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

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

Все. Вопрос решен.
Сделал на основе кастом контролов. Так проще создавать контролы
 
NickProstoNick, не расскажете поподробнее, как решили? У меня похожая задача назревает, собираю инфу... А уроды-индусы про одну из самых главных вкусняшек XPages старательно умалчивают. :-(
 
да-да...
Ну так вот.. задача - сделать опросник.
Один вопрос на страницу, но варианты ответа - разные...чекбокс, комбобокс, радиобаттон, редактируемое поле. Причем возможны комбинации
чекбокс/комбобокс + редактируемое поле, несколько редактируемых полей и т.д.

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

По этому решил копать в сторону динамического создания компонент.
Свел все к тому, что в дизайнере создается нужный кастом контрол и после динамически создаю этот контрол.
Вот код
Данные передаю через переменные viewscope
 
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. До кучи:
 
Последнее редактирование:
В общем вот что получилось
254.jpg
Каждый выделенный блок - это отдельный документ и кастом контрол.
Юниды документов передаются через название компонента, тем самым нет мусора в Scope-переменных.
Одно что не нравится - проверка полей. Валидатор сбрасывает значение из всех полей если ошибка допущена хотя бы в одном поле.
Приходится выбирать значения снова
 
...Одно что не нравится - проверка полей. Валидатор сбрасывает значение из всех ...
Я бы, наверное, проверял значение всех радио одновременно.
1 При каждом изменении. И по результату - скрывать/показывать кнопку "Дальше".
2 Или при нажатии кнопки "Дальше" - сообщение, если хотя-бы одна радио пустая.
 
проверяю я стандартным валидатором. Иначе за ранее не известно сколько будет датасорсов.
И не совсем понятно как эти датасорсы перебирать... хотя конечно можно попробовать... но это будет вторая итерация :(

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

Прошу прощения.. тупанул... совсем забыл что страница перерисовывается постоянно.
Исправил это нелепое недоразумение :)
Все гуд
 
Последнее редактирование модератором:
Продолжаю экспериментировать... сейчас уже с диалогами.
Диалог подгружаются, но есть момент - не работают стили :(
Нужно такой
257.jpg
А получаю такой :(
258.jpg

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

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab