Компонент Xpage, использующий UIDialog, UIDialog не отображает своих дочерних элементов

Я пытаюсь разработать компонент для моей компании, который должен иметь интегрированный диалог. Создание компонента было простым, пока я не наткнулся на диалоговое окно. Я хочу использовать com.ibm.xsp.extlib.component.dialog.UIDialog для своего компонента, потому что у него есть несколько приятных функций, которые я хочу использовать, поэтому создание собственного диалога с ClientSideDojo не вариант.

Обычно при добавлении компонента в другой я использую component.getChildren().add(MyNewComp),, но когда я пробую этот код:

public class myComponentWithADialog extends UIComponentBase implements FacesComponent {
    //...other Code...
    public void buildContents(FacesContext context, FacesComponentBuilder builder)
                throws FacesException {

          UIDialog dialog = new UIDialog();
            TypedUtil.getChildren(container).add(dialog);
            dialog.setStyleClass("dlgUserPref");
            dialog.setTitle("titelxyz");
            dialog.setId("TagDialog"); 

            UIPanelEx panel = new UIPanelEx();
            panel.setTagName("div");
            panel.setStyle("border:2px solid red;");
            panel.setStyleClass("lotusList lotusTags lotusRelatedTags");

            dialog.getChildren().add(panel);
            this.getChildren.add(dialog);
    }
  //....
}

Моя панель не отображается внутри диалогового окна при вызове XSP.openDialog('dialogClientId') в моем браузере диалоговое окно отображается, но пусто.

Я уже пробовал несколько других методов, таких как dialog.getPopupContent.getChildren().add(), но потом получаю сообщение об ошибке: javax.faces.component.UIPanel incompatible with com.ibm.xsp.extlib.component.dialog.UIDialog$PopupContent.

Также я пытался найти решение в Google, но нашел только запись по адресу openNTF от человека с такой же проблемой, но без какого-либо решения.

Примечание. Я также пытался «внедрить» некоторый контент в стандартный <xe:dialog> и в <px:panel> внутри <xe:dialog> с помощью кнопки с SSJS, например keithstric делает в своем блоге. Код:

var dialog:com.ibm.xsp.extlib.component.dialog.UIDialog = 
   getComponent('extlibdialog');

    if(dialog.getChildren().size() > 0) {     
        dialog.getChildren().clear(); 
    } 

    var TextField:com.ibm.xsp.component.xp.XspOutputText = new com.ibm.xsp.component.xp.XspOutputText();
        TextField.setTitle("test");
        TextField.setId("testTextField");
        TextField.setValue("<p>This is the new Content</p>");

    dialog.getChildren().add(TextField);

Этот код отлично работает для стандартного <xp:panel> вне диалогового окна, но не для самого диалогового окна или панели внутри него.


person Michael Saiz    schedule 03.09.2013    source источник


Ответы (1)


Диалог предварительно не отображается при загрузке страницы, а когда вы фактически вызываете его в XSP.openDialog(...)

Таким образом, вам нужно запустить свой код в этом событии (мобильный сейчас, не могу проверить, открыт ли он).

План Б: используйте диалог Dojo, поддерживаемый элементом управления отдыхом, чтобы вы могли передавать любые данные, которые вам нужны, туда и обратно.

Предостережение: всплывающие диалоги — это концепция пользовательского интерфейса, перенесенная из настольных приложений. Они чужды веб-приложениям и в основном не работают в мобильных устройствах. Вместо этого рассмотрите и встроенную форму (или мастер)

person stwissel    schedule 04.09.2013
comment
Но если я создам пользовательский компонент, в который я добавлю компонент UIDialog, а затем добавлю к нему несколько дочерних элементов, почему они не отображаются при вызове XSP.openDialog() на клиенте? Куда мне добавить все компоненты, которые я хочу отображать в диалоговом окне, если они не являются дочерними элементами. Я мог бы запустить SSJS, когда отображается диалоговое окно, тогда я могу получить все, что мне нужно, внутри диалогового окна, но это не помогает мне с моим компонентом. - person Michael Saiz; 04.09.2013
comment
Вы определяете статические дочерние элементы в источнике XPage. - person stwissel; 04.09.2013
comment
А что делать в моем Компоненте? Объявление их статическими и/или окончательными не помогает. - person Michael Saiz; 04.09.2013
comment
Не КОД. Разметка. Почему вы пытаетесь вручную создать детей? Я не понимаю этого. Просто создайте их как обычные элементы управления XPages во время разработки. - person stwissel; 05.09.2013
comment
Этот компонент станет частью библиотеки ControlLibrary нашей компании и должен быть интегрирован во все наши приложения. Поэтому, пока кто-то не изобретет что-то для совместного использования CustomControls через UpdateSite, я должен создать компоненты в (java/jsf) и поделиться ими как библиотекой. Часть с SSJS в моем вопросе - это просто примечание, что я пробовал несколько разных способов внедрить что-то внутри диалогового управления без какого-либо успеха. - person Michael Saiz; 05.09.2013
comment
Вы пытались поместить редактируемую область в диалоговое окно? Механизм возможен, если взять подсказку из этого: wissel.net/blog/d6plinks/SHWL -99W7MJ (вместо другого NSF добавьте его в либу -› или напишите их на Java) - person stwissel; 05.09.2013
comment
Я до сих пор не понимаю необходимости вводить что-либо в диалог во время выполнения. - person stwissel; 05.09.2013