Zk включенная страница .zul не работает с основным контроллером

Я использовал tabbox для создания страницы с вкладками. И каждая вкладка включает в себя еще одну страницу zul. У меня есть 1 контроллер, примененный к главной странице.

Если я добавлю какое-то действие к компоненту на включенной странице zul, в классе контроллера я не могу его поймать. Если я применяю контроллер к своему зулу, он создает новый экземпляр класса контроллера.

Вот мой код.

<zk>
    <style src="/resources/css/default.css" />
    <window id="Dealer" class="index"
        apply="com.i2i.prm.controller.IndexController" width="100%"
        height="100%">


        <div class="content" >

            <tabbox id="tb" width="100%" forward="onSelect=onSelect">
                <tabs id="tabs">
                    <tab id="info" label="INFO" />
                    <tab id="create" label="CREATE" />
                    <tab id="edit" label="EDIT" />

                </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>

                </tabpanels>
            </tabbox>
        </div>
    </window>

</zk>

И dealerEdit.zul

<zk>
<window title="Dealer Edit"  >
    <grid width="100%" sizedByContent="true">
                            <columns>
                                <column label="" />

                            </columns>
                            <rows>
                                <row >
                                    <label value="Name"></label>
                                    <textbox
                                        value="@{DealerController.user.name }">
                                    </textbox>
                                </row>
                                <row>
                                    <label value="Surname"></label>
                                    <textbox
                                        value="@{DealerController.user.surname }" forward="onChange=onASD">
                                    </textbox>
                                </row>
                                <row>
                                    <label value="Address"></label>
                                    <textbox
                                        value="@{DealerController.user.address }">
                                    </textbox>
                                </row>

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

Это мой класс контроллера (IndexController.java):

public class IndexController extends GenericForwardComposer {

    private User user = new User();;
    AnnotateDataBinder binder;
    Tabbox tb;

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

        user.setName("Abdul");
        user.setSurname("Rezzak");
        user.setAddress("Giderken sağda");



        binder.loadAll();
    }

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

    public void onDFG(ForwardEvent event){
        System.out.println(this.hashCode());
    }

    public void onASD(ForwardEvent event){
        System.out.println(this.hashCode());
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

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


Ответы (1)


  1. удалите <window title="Dealer Edit" > с включенной страницы (DealerEdit.zul), так как она формирует собственное IdSpace. Не забудьте удалить закрывающий тег </window>.
  2. измените имя метода onASD, включив в него идентификатор компонента Include, например onASD$DealerEditContent. Кажется, Include также формирует собственное IdSpace, и событие пересылки не работает через IdSpace.

Это должно работать.

ОБНОВЛЕНИЕ 1: я только что подтвердил, что Include является компонентом владельца IdSpace, поскольку он реализует интерфейс IdSpace, так что это единственный обходной путь в вашем случае.

ОБНОВЛЕНИЕ 2: я нашел еще один более простой способ справиться с пересылкой событий в разных IdSpace, который заключается в использовании пути к компоненту в файле ZUML для указания целевого компонента. Например, в вашем случае вы можете указать идентификатор страницы на странице main.zul.

<?page id="main" ?>

и при пересылке события на вашей включенной странице, такой как страница DealerEdit.zul

<textbox forward="onChange=//main/Dealer.onASD" />

Остальной код останется прежним.

Ссылка: http://books.zkoss.org/wiki/ZK_Developer%27s_Reference/Event_Handling/Event_Forwarding#Using_component_Path

person kachhalimbu    schedule 06.07.2011
comment
Это не работает в моем случае использования. У меня есть точно такой же пример, но без аннотаций. Нужно ли использовать аннотацию @Listen, чтобы убедиться, что она работает? - person daitangio; 10.06.2013
comment
@daitangio, где в моем ответе я использую аннотацию @Listen? Также опубликуйте новый вопрос с вашим кодом, который создает вашу проблему, чтобы мы могли ее рассмотреть, спасибо. - person kachhalimbu; 20.06.2013