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

Тема в разделе "Lotus - Xpages", создана пользователем NickProstoNick, 5 сен 2013.

  1. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Всем привет!
    Интересует вопрос динамического создания компонент так как это делает Repeat control с одной разницей - мне надо работать с массивом, а не видом.
    Кто-то реализовывал такое?
     
  2. alexas

    alexas Well-Known Member

    Регистрация:
    10 июн 2009
    Сообщения:
    215
    Симпатии:
    0
    Так RepeatСontrol и работает с массивом. Походу ему все равно, что съедать.

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

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Ла. То. Я уже тоже разобрался, но не успел отписать.
    Кстати, для доступа к данным репитера не использую никаких индексов. Просто пишу имя коллекции репитера
     
  4. alexas

    alexas Well-Known Member

    Регистрация:
    10 июн 2009
    Сообщения:
    215
    Симпатии:
    0
    Спсб. Учту.
     
  5. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Но тут еще один нюанс, который усложняет жизнь.
    В этих динамических компонентах должны быть разные значения.
    Конкретней - меня интересуют компоненты свозможностью выбора (чекбоксы, радибаттоны и т.д. )
    Получить в итоге нужно такое. Один нюанс - на скрине варианты ответа разные, просто лень писать было
    252.jpg
     
  6. alexas

    alexas Well-Known Member

    Регистрация:
    10 июн 2009
    Сообщения:
    215
    Симпатии:
    0
    Похожее проходил, если Вас правильно понял.
    На OnClick (у меня были кнопки) по индексу репитера менял соответсвующее значение массива-источника (У Вас на OnChange).
    Типа запоминал действие - нажатие на кнопку. Для Вашего случая - чекбокс.
    Для двух других случаев можно попробовать сделать аналогично - запоминать в массиве-источнике индекс радиобатона или листбокса.
    Понятно написал?
     
  7. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Не очень понятно.
    Но может и я не очень понятно выразился.

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

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

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

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

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


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

    alexas Well-Known Member

    Регистрация:
    10 июн 2009
    Сообщения:
    215
    Симпатии:
    0
    Хотелку вроде уразумел. Так не делал, а нотус сейчас далеко - отдыхаю. Сорри :(
    До чего додумаетесь, дайте знать. OK? Ценная задача!
     
  9. Darkhan

    Darkhan Well-Known Member

    Регистрация:
    14 дек 2012
    Сообщения:
    95
    Симпатии:
    4
    Если элемент массива репитера какой-нибудь "свой" объект (bean), то можно скрывать (rendered) ненужные компоненты внутри репитера используя булевое свойство объекта репитера. Типа этого:
    Код (Text):
    <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>
     
  10. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Это самое простое решение, но страница будет нагружена (в плане код)... разбираться потом будет сложно.
    Сейчас у меня получается подгружать страницу (кастом контрол) динамически без перезагрузки страницы.
    Если использовать репитер - возникает проблема, в каждой новой строке повторяются компоненты из предыдущих строк.
    Вот решу как быть - отпишусь
     
  11. Darkhan

    Darkhan Well-Known Member

    Регистрация:
    14 дек 2012
    Сообщения:
    95
    Симпатии:
    4
    Так можно заюзать property definition кастом контроля, для передачи параметров скрытия
     
  12. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Дело в том, что один и тот же компонент может повторяться несколько раз.
    Вот код динамического добавления кастом контрола, где 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);
    }
    Остается вопрос привязки контрола к данным
     
    #12 NickProstoNick, 10 сен 2013
    Последнее редактирование модератором: 29 ноя 2015
  13. alexas

    alexas Well-Known Member

    Регистрация:
    10 июн 2009
    Сообщения:
    215
    Симпатии:
    0
    Nick, немного по теме, правда на китайском ;) (гугольный перевод)
    [From IBM]
     
  14. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    да, не плохо... но блин никто не описывает как добавить данные для выбора :(
    мда... хелп вообще никакой :(
     
  15. Мыш

    Мыш Lotus team
    Lotus team

    Регистрация:
    12 фев 2008
    Сообщения:
    1.019
    Симпатии:
    8
    Есть метод setText - устанавливает визуально отображаемый текст, скажем, для radiobutton (совпадает ли он с сохраняемым значением - хз). Вообще, можно нарисовать нужный элемент вручную, затем получить его программно через getComponent и поизучать его свойства через всякие get-методы... В общем, методом научного тыка...
    Код (LotusScript):
    var radio1: com.ibm.xsp.component.xp.XspInputRadio = getComponent("RadioID");
    var st = radio1.getText();
    view.postScript("alert(" + st + ");");
     
  16. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Вот вот :( а на тыканья времени нет :( но похоже придется.
    А всего-то надо добавить значения для выбора
     
  17. Мыш

    Мыш Lotus team
    Lotus team

    Регистрация:
    12 фев 2008
    Сообщения:
    1.019
    Симпатии:
    8
    А если заюзать исходный java-код для статически созданного элемента? Дизайнер, вроде, сохраняет код в файлах на диске...
     
  18. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    разобрался... Хотя возможно не правильно
    Код (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)
    но все равно есть проблема :( радиобаттоны не рисуются в родительском контейнере :(
     
    #18 NickProstoNick, 11 сен 2013
    Последнее редактирование модератором: 29 ноя 2015
  19. Мыш

    Мыш Lotus team
    Lotus team

    Регистрация:
    12 фев 2008
    Сообщения:
    1.019
    Симпатии:
    8
    Хммм... Вообще не рисуются? У мну (код в кнопке, проверяю на клиенте Notes) рисуются, но после них добавляется какая-то левая рамка шириной во всю страницу.
     
  20. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Рисуются.
    Эта рамка и есть радиогруппа. Компоненты должны бы рисоваться в ней.
    Возможно я не правильно "рисую" компоненты
     
Загрузка...

Поделиться этой страницей