【问题标题】:Triggering a server request (ajax?) after page render to re-render certain parts of the page in apache wickets在页面渲染后触发服务器请求(ajax?)以在 apache wickets 中重新渲染页面的某些部分
【发布时间】:2013-01-28 11:18:03
【问题描述】:

在我的页面上有一个显示汽车经销商列表的面板。面板显示经销商列表,其中包含每个经销商的信息,如下所述。

  • 对于我需要显示的每个经销商:姓名、地址、电话、营业时间。数据是 json 格式。
  • 姓名、地址、电话:它们是简单的文本标签。
  • 小时:每个经销商都有一个“查看小时”链接。单击它时,如果小时数据尚不存在,则文本标签会向下滑动显示“正在加载-gif”的链接,否则会显示小时数据。再次点击链接会隐藏小时数据。

当页面被渲染时,这是我需要的行为:

  • 在页面渲染中,我显示姓名、地址、电话标签和小时链接。到目前为止,我确实没有在 json 中有时间信息。
  • 页面呈现后,我想向服务器发出请求(Ajax ?),获取带有小时信息的更新 json 并重新呈现“查看时间”,以便在单击时显示小时。 这是我不知道该怎么做。

为什么我最初不发送带有小时信息的 json?这是因为收集成本很高,而且很少会使用“查看时间”链接。因此,预先收集所有这些数据会使页面呈现速度变慢。我希望页面加载的事件/行为触发获取小时数据的请求并重新呈现单击“查看时间”链接时向下滑动的小时文本标签。

我查看了AjaxSelfUpdatingTimerBehavior,但它的触发器是持续时间,而不是页面加载。

【问题讨论】:

    标签: ajax wicket wicket-1.5


    【解决方案1】:

    由于view hours 链接将“很少”使用,根据您的说法,最好按需获取这些数据,而不是在页面加载期间/之后将它们全部提取出来。

    这反过来会减少在页面中收集大量数据的开销,并且还可以让您免于将每个数据与每个记录关联、解析它们并将它们放入 HTML 中。

    【讨论】:

    • 谢谢。这确实发生在我身上,但“查看时间”仍然是一项功能,我们决定与其让用户在点击后等待,不如利用用户浏览页面时的时间来加载额外的内容。所以我不会在每次点击“查看时间”按钮时发出 ajax 请求。我想在页面加载后获取所有时间信息并呈现所有“查看时间”文本标签。
    【解决方案2】:

    尝试添加“查看时间”链接和代码以获取面板上的数据,然后使用 AjaxLazyLoadPanel http://www.mkyong.com/wicket/how-do-use-ajaxlazyloadpanel-in-wicket/ 延迟加载该面板。您可以在应用程序收集数据时为每个链接显示加载 gif。

    【讨论】:

      【解决方案3】:

      您可以为此使用AjaxLazyLoadPanel(如 drobson 建议的那样)。这很好用,但在您的场景中它可能有 1 个缺点。要更新的每一个小时都将是一个同步的 AJAX 调用,因此每个小时都需要单独更新。这可能意味着更多的流量和不理想的用户体验。

      另一种选择可能是将AbstractDefaultAjaxBehavior 添加到您的页面,这将更新时间(并将整个面板添加到目标)。您可以在文档加载后调用此行为生成的方法。

          this.add(new AbstractDefaultAjaxBehavior() {
      
              @Override
              protected void respond(AjaxRequestTarget target) {
                  //calculate hours + add list or whatever to the target
              }
      
              @Override
              protected CharSequence getCallbackScript() {
                  StringBuilder result = new StringBuilder();
      
                  result.append("function resetHours() {\n");
                  result.append("wicketAjaxPost('" + this.getCallbackUrl() + "', null, function(){}, function(){});" + "\n");
                  result.append("}\n");
                  return result;
              }
          });
      

      还有电话:

      public void renderHead(IHeaderResponse response) {
          response.renderOnLoadJavaScript("resetHours()");
      }
      

      【讨论】:

        猜你喜欢
        • 2021-07-19
        • 1970-01-01
        • 2019-04-07
        • 1970-01-01
        • 1970-01-01
        • 2022-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多