【问题标题】:(Wicket) Change visibility during ajax response(Wicket) 在 ajax 响应期间更改可见性
【发布时间】:2010-02-05 19:42:07
【问题描述】:

我有一个 AjaxPagingNavigator。基本上在某个条件下,AjaxPagingNavigator 页面的列表被重新加载。发生这种情况时,我只想在列表包含超过 1 页时呈现导航器。

那么有谁知道我可以在哪里附加一个处理程序,以便我可以检查我的 AjaxPagingNavigator 中的可见性条件并启用/禁用可见性,以便在导航器更新时通过。 ajax 是否可见?

标记:

<div wicket:id="mainWrap">
    <div wicket:id="navigator"/>
    <div wicket:id="listWrap">
        <div wicket:id="list><!-- here be content --></div>
    </div>
</div>

所以我有一个刷新“mainWrap”的 ajax 事件,它刷新“导航器”以及“列表”和包装。

这是触发整个事件的事件。

 protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
     List foo = null; // do work to get list
     model.setFound(found); // update the model (thus updating "list")
     target.addComponent(mainWrap);
}

编辑:我知道我会写

navigator.setVisibility(list.getPageCount() > 1);

在创建导航器和更新模型之后,但我希望将其封装在 AjaxPagingNavigator 的子类中。

【问题讨论】:

    标签: java wicket


    【解决方案1】:

    小心在被覆盖的 isVisible 方法中进行昂贵的计算,因为 Wicket 会在每个请求中多次调用 isVisible - 不包括您可能无意中进行的任何调用。

    通常最好的解决方法是覆盖 onConfigure 并手动设置可见性标志。

    @Override
    void onConfigure() {
        super.onConfigure();
        setVisible(isVisible() && someExpensiveToCalculateCondition);
    }
    

    onConfigure 在请求处理过程中只调用一次,并为所有组件调用,包括那些不可见的组件(而onBeforeRender 只为可见组件调用)。

    【讨论】:

    • 我非常喜欢这个答案。感谢您在未来如此多地复活这个问题:)
    • +1 - 这个是救命稻草(值得两票赞成:)。但是为什么要在“onConfigure”上调用“isVisible”呢?使用 Dmitriy 的示例,如果第一个 ajax 为“someExpensiveToCalculateCondition”返回“false”,而第二个返回“true”,我相信“isVisible”将使整个表达式为 false。
    • Eduardo,这显然取决于用例。人们通常调用 isVisible() 来尊重 onConfigure 链上某处的可见性变化。
    【解决方案2】:

    我已经有一段时间没有接触 Wicket 了,但如果没记错的话:

    您能否不重写“导航器”对象的 isVisible() 方法,使其仅在您希望的条件下显示?

    例如像

    .addComponent(new AjaxPagingNavigator(...) {
      @Override public boolean isVisible() { 
        return model.getFound().size() > 25;
      }
    });
    

    【讨论】:

    • 哈!我觉得自己好傻。在这里,我通过各种疯狂的行为来附加和设置可见性。哦!顺便说一句“返回 super.isVisible() && this.getPageable().getPageCount() > 1;”可能更好,因为我们想确保如果其他人将我们设置为隐形我们尊重它。
    • 别觉得自己很愚蠢...当我开发 Wicket 应用程序时,我通常会花费大量时间寻找各种问题的解决方案,而当我找到它们时,它们几乎总是比我简单得多预计。
    • 我会同意的。我认为 Wicket 开发人员做得很好,因为通常当我研究一个问题时,我意识到解决/修复是多么容易,而且比我想象的更直观。
    • 应该总是在 onConfigure() 中设置可见,原因在答案中列出。
    • 确实如此。正如@Sarhanis 所提到的,Wicket 大师覆盖isVisiblenot recommended。相反,覆盖onConfigure 并从那里控制可见性。
    猜你喜欢
    • 2011-08-27
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多