Zk, как добраться до включенного компонента страницы .zul по идентификатору?

Я не могу получить доступ к компоненту по идентификатору на включенной странице .zul. У меня есть один main.zul с контроллером, и мне нужно получить компонент на включенной странице zul через класс контроллера java, но он возвращает null.

Я знаю, что включенный метод создает новое пространство идентификаторов, но есть ли способ получить этот компонент?

ОБНОВЛЕНИЕ

Вот мой код:

главная страница зула

<?page title="DealerVizard.zul"?>

<?page id="main" ?>

<?taglib uri="http://www.zkoss.org/dsp/web/core" prefix="c"?>
<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" arg0="./Dealer" ?>
<zk>
    <style src="/resources/css/default.css" />
    <window id="Dealer" class="index" 
        apply="com.i2i.prm.controller.IndexController">


        <div class="content" width="100%">

            <tabbox id="tb" forward="onSelect=onSelect">
                <tabs id="tabs">
                    <tab id="info" label="INFO" />
                    <tab id="create" label="CREATE" />
                    <tab id="edit" label="EDIT" />
                    <tab id="test" label="TEST PANEL(LIST BOX)" />

                </tabs>
                <tabpanels>
                    <tabpanel id="DealerInfo">
                        <include id="DealerInfoContent"
                            src="View/Dealer/DealerInfo.zul" />
                    </tabpanel>
                    <tabpanel id="DealerCreate">
                        <include id="DealerCreateContent"
                            src="View/Dealer/DealerCreate.zul" />
                    </tabpanel>
                    <tabpanel id="DealerEdit">
                        <include id="DealerEditContent"
                            src="View/Dealer/DealerEdit.zul" />
                    </tabpanel>

                    <tabpanel id="PagingListBox">
                        <include  id="PagingListBoxContent"  // Included here
                            src="View/TEST/PagingListBox.zul" />
                    </tabpanel>
                </tabpanels>
            </tabbox>
        </div>
    </window>

</zk>

PagingListBox.zul (Включенная страница)

<?page id="list" ?>

<zk>

    <grid width="100%">

        <columns>
            <column label="" />

        </columns>
        <rows>
            <row>
                <listbox id="listModel" width="100%" height="100%"
                    visible="true" span="true" pagingPosition="top" rows="20"
                    selectedItem="@{DealerController.selected}"
                    model="@{DealerController.userList}"
                    forward="onSelect=//main/Dealer.onSelect">
                    <auxhead>
                        <auxheader colspan="1">
                            <textbox
                                value="@{DealerController.searchUser.name}" maxlength="9"
                                id="searchCO_ID" forward="onChanging=//main/Dealer.onSearch"
                                width="100%">
                            </textbox>
                        </auxheader>
                        <auxheader colspan="1">
                            <textbox
                                value="@{DealerController.searchUser.surname}" maxlength="21"
                                id="searchMSISDN" forward="onChanging=//main/Dealer.onSearch"
                                width="100%">
                            </textbox>
                        </auxheader>
                        <auxheader colspan="1">

                        </auxheader>

                    </auxhead>

                    <listhead>
                        <listheader label="Name"
                            sort="auto(UPPER(name))" />

                        <listheader label="Surname"
                            sort="auto(UPPER(surname))" />


                        <listheader label="Delete ?" />
                    </listhead>


                    <listitem self="@{each=USERLIST}">

                        <listcell>
                            <label value="@{USERLIST.user.name}" />
                            <textbox
                                value="@{DealerController.tmpUser.name}" visible="false" />
                        </listcell>
                        <listcell>
                            <label value="@{USERLIST.user.surname}" />
                            <textbox
                                value="@{DealerController.tmpUser.surname}" visible="false" />
                        </listcell>

                        <listcell>
                            <button label="Update"
                                forward="onClick=//main/Dealer.onUpdate" visible="false" />
                            <button image="icons/edit-delete.png"
                                label="Delete" forward="onClick=//main/Dealer.onDelete"
                                width="100%" disabled="true" />
                            <button label="Save"
                                forward="onClick=//main/Dealer.onSave" visible="false" />
                            <button label="Cancel"
                                forward="onClick=//main/Dealer.onCancel" visible="false" />
                        </listcell>
                    </listitem>
                </listbox>
                <paging id="pagingData" pageSize="20" />
            </row>

        </rows>
    </grid>
</zk>

IndexCONtroller.java

public class IndexController extends  GenericForwardComposer  {

    private List<User> userList = new ArrayList<User>() ;
    AnnotateDataBinder binder;
    Tabbox tb;
    Window Dealer;
    private int pageCount=0;

    @Override
    public void doAfterCompose(Component comp) throws Exception {
        // TODO Auto-generated method stub
        super.doAfterCompose(comp);
        comp.setVariable(comp.getId() + "Controller", this, true);
        binder = (AnnotateDataBinder) Dealer.getVariable("binder", true);


    System.out.println(Path.getComponent("//list/listModel"));
    }


    public IndexController() {
        // TODO Auto-generated constructor stub
    }
}

person Ercan    schedule 12.07.2011    source источник


Ответы (4)


Обычно я бы не рекомендовал использовать Path.getComponent() способ доступа к другим компонентам, поскольку код вашего приложения становится тесно связанным со структурой вашего компонента на странице просмотра. В вашем случае самым простым способом является использование AbstractComponent#getFellow(String compId), например, для.

Include inc = (Include) Dealer.getFellow("PagingListBoxContent");
Listbox listModel = (Listbox) inc.getFellow("listModel");
System.out.println(listModel);

Поэтому в будущем, даже если вы вставите какой-либо другой компонент на свою страницу ZUML перед своим списком, ваш код все равно будет работать.

ОБНОВЛЕНИЕ: кстати, была интересная пост в блоге на эту же тему в блоге ZK недавно

person kachhalimbu    schedule 13.07.2011

если у вас есть идентификатор, вы можете использовать знак доллара, чтобы получить внутренние компоненты

  <zk>
  <include id="inc" src="test.zul />

  </zk>

тест.зул

    <zk>
    <label id="lab1" value="test1" />
    </zk>

вы можете использовать "inc $ lab1", чтобы получить метку в test.zul

person Ryan Wu    schedule 15.07.2011

Вы можете получить доступ к любому компоненту в любом другом пространстве идентификаторов, используя zscript или java. если он находится на той же странице, но в другом окне (компонент B в окне A):

Path.getComponent("/A/B");

если он находится на другой странице, то (компонент B в окне A на странице P):

Path.getComponent("//P/A/B");

Вы можете найти документацию здесь: http://books.zkoss.org/wiki/ZK%20Developer%27s%20Reference/UI%20Composing/ID%20Space

person Miklos Csuka    schedule 12.07.2011
comment
Я пробовал это, но это работает только для страницы просмотра, которая принадлежит классу контроллера. используя System.out.println(Path.getComponent(//includedPageID/listboxID)); возвращает ноль. Включенная страница не имеет окна. Только теги div и список. - person Ercan; 12.07.2011
comment
@Meko: Мне ваш код кажется нормальным, я сделал небольшой макет, чтобы проверить его (с ZK 3.6.4). //list/listModel должен разрешать список во включенном ZUL. Возможно ли, что вы использовали список идентификаторов страниц в нескольких файлах ZUL, поэтому он не уникален? - person Miklos Csuka; 12.07.2011

Вы можете добавить в свой IndexController.java:

...
   private Include DealerInfoContent;
...

таким образом вы можете получить доступ к включенному компоненту в родительском композиторе.

(Я бы предложил использовать для этого идентификаторы camelCase).

person bartolomeon_n    schedule 25.05.2016