Wicket组件层次结构-getParent

问题描述

| 我做了一个实验。首先,我要声明html:
<form wicket:id=\"form\">
<table>
    <tr>
        <td>
            <table style=\"border: 1px solid;\" cellspacing=\"0\" cellpadding=\"0\">
                <tr wicket:id=\"row\">
                    <td wicket:id=\"column\" style=\"border: 1px solid #3A6395\">
                        <div wicket:id=\"div\">
                            <span wicket:id=\"panel\"></span>
                            <span wicket:id=\"tooltip\"><span wicket:id=\"tooltipPanel\"></span></span>
                        </div>
                    </td>
                </tr>
            </table>
        </td>
        <td>
            &nbsp;
        </td>
    </tr>
</table>
</form>
<wicket:fragment wicket:id=\"labelFragment\">
    <span wicket:id=\"value\"></span>
</wicket:fragment>
<wicket:fragment wicket:id=\"linkFragment\">
    <a href=\"\" wicket:id=\"link\">
        <span wicket:id=\"value\"></span>
    </a>
</wicket:fragment>
Java:
private class ReportdisplayByUserWithTaskTypeSortForm extends Form {

        private static final long serialVersionUID = 10162L;

        public ReportdisplayByUserWithTaskTypeSortForm(String id) {
            super(id);
            setoutputMarkupId(true);
            addComponent();
        }

        private void addComponent() {           
            ListView row = new ListView(\"row\",new LoadableDetachableModel() {

                private static final long serialVersionUID = 10164L;

                @Override
                protected Object load() {
                    return getUserMonitorMap();
                }
            }) {

                private static final long serialVersionUID = 10165L;

                @Override
                protected void populateItem(ListItem rowItem) {
                    @SuppressWarnings(\"unchecked\")
                    List<? extends Element> columnMap = (List<Element>) rowItem.getModelObject();
                    ListView column = new ListView(\"column\",columnMap) {

                        private static final long serialVersionUID = 10166L;

                        @Override
                        protected void populateItem(ListItem columnItem) {
                            Element element = (Element) columnItem.getModelObject();

                            WebMarkupContainer div = new WebMarkupContainer(\"div\");
                            Label value = new Label(\"value\");
                            Fragment fragment = null;

                            if (element instanceof TaskTypeLabelElement) {
                                fragment = new Fragment(\"panel\",\"linkFragment\",this);

                                AjaxLink link = new AjaxLink(\"link\") {

                                    private static final long serialVersionUID = 10163L;

                                    @Override
                                    public void onClick(AjaxRequestTarget target) {
                                        sortAsc = !sortAsc;
                                        doSort();                                       
                                        target.addComponent(this.getParent().getParent().getParent().getParent().getParent().getParent().getParent());                                      
                                    }
                                };
                                link.add(value);
                                fragment.add(link);
                            } else {
                                fragment = new Fragment(\"panel\",\"labelFragment\",this);
                                fragment.add(value);
                            }

                            // some other code goes here

                            columnItem.add(div);
                        }
                    };
                    rowItem.add(column);
                }
            };

            add(row);
        }
    }
}
片段中的链接实例化为:
AjaxLink link = new AjaxLink(\"link\") {

        private static final long serialVersionUID = 10163L;

        @Override
        public void onClick(AjaxRequestTarget target) {
            System.out.println(this);
            System.out.println(this.getParent());
            System.out.println(this.getParent().getParent());
            System.out.println(this.getParent().getParent().getParent());
            System.out.println(this.getParent().getParent().getParent().getParent());
            System.out.println(this.getParent().getParent().getParent().getParent().getParent());
            System.out.println(this.getParent().getParent().getParent().getParent().getParent().getParent());
            System.out.println(this.getParent().getParent().getParent().getParent().getParent().getParent().getParent());
            System.out.println(this.getParent().getParent().getParent().getParent().getParent().getParent().getParent().getParent());
            System.out.println(this.getParent().getParent().getParent().getParent().getParent().getParent().getParent().getParent().getParent());
        }
    };
System.out.println的输出
15:58:17,476 INFO  [STDOUT] [MarkupContainer [Component id = link]]
15:58:17,477 INFO  [STDOUT] [MarkupContainer [Component id = panel]]
15:58:17,477 INFO  [STDOUT] [MarkupContainer [Component id = div]]
15:58:17,477 INFO  [STDOUT] [MarkupContainer [Component id = 0]]
15:58:17,477 INFO  [STDOUT] [MarkupContainer [Component id = column]]
15:58:17,477 INFO  [STDOUT] [MarkupContainer [Component id = row]]
15:58:17,477 INFO  [STDOUT] [MarkupContainer [Component id = form]]
15:58:17,477 INFO  [STDOUT] [Page class = info.release.wicket.ReportdisplayByUserWithTaskTypeSort,id = 4,version = 0]
15:58:17,477 INFO  [STDOUT] null
我的问题是: \“ Component id = div \”和\“ Component id = column \”之后,\“ Component id = 0 \”的含义是什么,这个组件是什么? 最后一行的“ id = 4,version = 0 \”是什么意思?     

解决方法

ID为0的组件是
ListItem
,它们的ID是它们在包含的
ListView
中的索引。 每个页面都为每个会话分配了一个ID(\“ id = 4 \”),请参见页面的API文档中的\“ Identity \”段落。 每个页面的版本可能都支持后退按钮(\“ version = 0 \”),请参见页面的API文档中的“后退按钮\”段落。如果启用,则会话中每页将存储多个版本。新版本通常由表单提交触发。您可以使用forminput示例进行尝试,以不同的值多次提交表单,查看URL(可以看到递增的版本),然后尝试使用浏览器的后退按钮。