【问题标题】:Hiding Wicket WebMarkupContainer won't work隐藏 Wicket WebMarkupContainer 不起作用
【发布时间】:2015-08-25 14:32:47
【问题描述】:

嘿,我有一个嵌套在 ListView 中的 ListView,并且想要在单击 AjaxLink 时更改内部 ListViews 的可见性。

我看到了很多关于它的帖子,并从中得到了一些建议。 例如。 : .setMarkupId(true), 添加一个 WebMarkupContainer, ...

但没有任何帮助。无论如何,这就是我到目前为止所得到的。

public class EditZustaendigkeit extends WebPage {
private static final long serialVersionUID = 1L;
private List<Institut> institute = new ArrayList<Institut>();
private Form<Void> mainForm = new Form<Void>("mainForm");

public EditZustaendigkeit() {
    this.add(mainForm);
    createInstitute();

    mainForm.add(new ListView<Institut>("listView", getInstitute()) {

        private static final long serialVersionUID = 1L;

        protected void populateItem(final ListItem<Institut> item) {
            final int index = item.getIndex();
            AjaxLink<String> myLink;
            IModel<String> labelModel = Model.of("+");
            final Institut institut = (Institut) institute.get(index);

            item.add(new Label("institutLabel", new PropertyModel<Institut>(institut, "langName")));


            final WebMarkupContainer div = new WebMarkupContainer("cont");
            div.setOutputMarkupId(true);
            div.setOutputMarkupPlaceholderTag(true);
            div.add(new ListItemZustaendigkeit("zustaendigkeiten", item, institut));
            item.add(div);

            item.add(myLink = new AjaxLink<String>("extenderInstitut") {
                private static final long serialVersionUID = 1L;

                @Override
                public void onClick(AjaxRequestTarget target) {
                    collapseItem(index, item, div);
                    target.add(mainForm);
                    item.add(div);
                    setResponsePage(getPage());
                }
            });
            myLink.setBody(labelModel);
            myLink.setOutputMarkupId(true);

            item.add(new CheckBox("institutCheck", Model.of(Boolean.FALSE)) {
                private static final long serialVersionUID = 1L;
                // todo
            });
        }
    });
}

public void expandAllItem(ListView<Institut> listView) {

}

public void collapseAllItem(ListView<Institut> listView) {

}

public void expandItem(int index, ListItem<Institut> item, WebMarkupContainer div) {
    div.setVisible(true);
}

public void collapseItem(int index, ListItem<Institut> item, WebMarkupContainer div) {
    div.setVisible(false);
}

ListItemZustaendigkeit 从 Panel 扩展而来。它有它对应的 .html 文件。

现在我想专注于public void collapseItem(),因为我想如果可以解决一个问题,那么其他所有问题也应该是可能的。

【问题讨论】:

  • 只是一个疯狂的猜测,您是否尝试在ListView 上设置setReuseItems(true)?这将帮助 Wicket 为列表元素保持相同的 id 属性,如果要通过 Ajax 刷新视图,这可能会有所帮助。还可以按照here 的说明查看setOutputMarkupPlaceHolderTag()
  • 谢谢你们,现在可以了! :)
  • 很高兴知道它已被整理出来 :) 请您抽出时间通过选中旁边的绿色勾号将解决您的问题的答案标记为已接受?如果您通过其他方式解决了问题,请注意您也可以添加自己的答案并接受它。这样,问题的未来访问者将清楚地确定正确答案,我们将有一个更好的 SO。
  • 只是在游览中阅读,但感谢您的提示。 :)
  • 注意边距。检票口“传福音”更喜欢覆盖 getter bool isVisible() { return authorCondition;} 而不是 setVisible(condition)。在少数情况下,这对我有帮助。当然,并非总是可以覆盖。

标签: java listview wicket wicketstuff


【解决方案1】:

问题似乎出在“extenderInstitut”的onClick 中。您正在调用setResponsePage,这将导致您的中继器再次初始化。此外,您希望在mainForm 上拥有setOutputMarkupId(true)

item.add(myLink = new AjaxLink<String>("extenderInstitut") {
  private static final long serialVersionUID = 1L;

  @Override
  public void onClick(AjaxRequestTarget target) {
    collapseItem(index, item, div);
    target.add(mainForm);
  }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多