【问题标题】:How to set anchor for wicket listview panel update with ajax如何使用 ajax 设置 wicket listview 面板更新的锚点
【发布时间】:2012-11-15 17:03:57
【问题描述】:

我在面板中有一个 ListView,它启用了垂直滚动并使用 css 进行绝对定位。当我选择一个添加到 listView 的 IndicatingAjaxFallbackLink 时,它会更新页面上的其他面板,以便为 listItem 提供更多信息/选项。它还刷新 listView 以添加一个 css 类来突出显示选定的 listItem。我正在尝试向 listView 添加一个锚点,以便它呈现滚动以显示选定的 listItem。

问题:当我从列表中选择一个项目时,listView 将重新加载并滚动到面板顶部,而不是选择的项目。如果没有 url 重定向和整页重新加载,这可能吗?

标记:

<div wicket:id="psbContainer" style="position: absolute; top: 325px; height: 300px; overflow-y: auto; left: 4px; right: 305px;">
    <table width="100%">
        <tr wicket:id="psbList" valign="top">
            <td><a wicket:id="viewRelated"><span wicket:id="psbNum"/></a></td>
            <td wicket:id="summary"/>
            <td wicket:id="psbMilestone"/>
            <td wicket:id="dueDate"/>
            <td wicket:id="devCount"/>
            <td wicket:id="activeCount"/>
            <td wicket:id="ccCount"/>
            <td wicket:id="team"/>
        </tr>
    </table>
</div>

java:

    psbListView = new ListView("psbList", psbList) {
        protected void populateItem(ListItem listItem) {
            final Space psb = (Space) listItem.getModelObject();
            if(psb.equals(psbSelected)) {
                listItem.add(selected);
            }
            // viewRelated ========================================================
            IndicatingAjaxFallbackLink viewRelated = new IndicatingAjaxFallbackLink("viewRelated") {
                public void onClick(AjaxRequestTarget target) {
                    psbSelected = psb;
                    target.addComponent(pslpContainer);
                }
            };
            this.setOutputMarkupId(true);
            this.setMarkupId(psb.getPsbNum());
            viewRelated.setAnchor(this);
            viewRelated.add(new Label("psbNum", new Model(psb.getPsbNum())));
            listItem.add(viewRelated);
            ...

【问题讨论】:

  • target.addJavascript( "getElementById( \""+this.getMarkupId()+"\").scrollIntoView()"); 中的 onClick() 应该可以解决问题。 (它可能在语法上不正确,但我无法检查它,希望你能明白这一点。)
  • 只刷新当前选中的项目(连同之前选中的项目)而不是整个列表不是更容易吗?
  • @biziclop 感谢您的建议,我会尝试一下。
  • @Nicktar - 我没有成功为 listView 中的项目执行 ajax 更新,wicket 更新了 listView 中的最后一个项目,所以我一直在更新整个列表。如果您熟悉如何做到这一点,我将不胜感激。我正在使用 wicket 1.4.17,但计划很快更新到 6。
  • @OnesAndZeros 你在 wicket in action 博客上尝试过 this article 的建议吗?

标签: java html ajax wicket


【解决方案1】:

为什么不在 AjaxRequestTarget 中使用纯 javascript 更新客户端 css 样式?应该不会超过

ListItem<?> previousSelected = ...;
ListItem<?> currentSelected = ...;

target.appendJavaScript("document.getElementById('" + previousSelected.getMarkupId() + "').className=\"\";");
target.appendJavaScript("document.getElementById('" + currentSelected.getMarkupId() + "').className=\"selected\";");

这样你不必更新整个列表视图来改变一些类。

【讨论】:

  • 谢谢Martijin。我终于回到了这个问题上,我的代码和你描述的一样,我只需要确保我 setMarkupId() & setOutputMarkupId()。我还使用 response.render(OnLoadHeaderItem.forScript(... 添加了 new Behavior() 以便指示器将显示在页面加载和正确刷新上。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
相关资源
最近更新 更多