0

以下情况:

我的 Wicket 应用程序与 javascript 结合使用。

例如,有一个具有标签的页面。此标签具有“ON”作为文本集:

Label state = new Label("serverState", server.getStatus().getState());

server.getStatus().getState() 此时将返回“ON”。

此外,我在此页面上有一些 javascript,它将每 10 秒更新一次此“serverState”标签。它可能已更改为“关闭”(通过 javascript)。

我的问题是:有什么方法可以得到关于“标签文本已更改”的通知。我需要它,因为我想显示 (setVisible(true)) 另一个组件,但前提是文本已更改。

4

4 回答 4

2

您可以将自定义 AjaxEvent-Listener 添加到您的标签。在将开关从 ON 更改为 OFF 并返回后,您的 Javascript 应该会触发该事件:

Label state = new Label("serverState", server.getStatus().getState());
state.setMarkupId("mylabelid");
state.add(new AjaxEventBehavior("updatestateON") {
  protected void onEvent(AjaxRequestTarget target) {
    // Do something; switch is ON now
  }
});

state.add(new AjaxEventBehavior("updatestateOFF") {
  protected void onEvent(AjaxRequestTarget target) {
    // Do something; switch is OFF now
  }
});

在 Javascript 中,您在开关更改值后调用此函数:

function triggerWicket(newstate) {
  if (newstate == 'ON') {
    $('#mylabelid').trigger('updatestateON');
  } else {
    $('#mylabelid').trigger('updatestateOFF');
  }
}
于 2013-08-21T09:16:09.513 回答
1

我会使用 AbstractDefaultAjaxBehavior 并更新服务器端

AbstractDefaultAjaxBehavior updateState = new AbstractDefaultAjaxBehavior()
{
  @Override
  protected void respond(AjaxRequestTarget _target)
  {
    String newState = RequestCycle.get().getRequest().getRequestParameters().getParameterValue("state").toString();
    state.setDefaultModel(newState)
    _target.add(state);
  }
};

然后让网页在页面加载时添加一个 javascript 函数,并在客户端调用 updateState(state); 与新值。

@Override
public void renderHead(IHeaderResponse response)
{
    super.renderHead(response);
    response.render(JavaScriptHeaderItem.forScript("function updateState(state) {Wicket.Ajax.get({'u':'"+ updateState.getCallbackUrl() +"&state=' + state})}", "updateState"));
}
于 2013-08-21T07:46:36.390 回答
0

Wicket 是一个服务器端的 Web 框架。为了更改组件的内容或可见性,它需要了解服务器端更改的条件。

假设服务器上的 server.getStatus().getState() 将反映您提到的更改,您可以使用AjaxSelfUpdatingTimerBehavior每 X 秒/分钟/等更新页面上的组件(子集)。(它基于Duration)。

编辑:当组件更新(添加到 ajaxrequest)时,您可以使用 Robert Niestroj 的答案设置第二个组件可见,因为 onConfigure 将为添加到 ajarequest 的每个组件(直接或通过层次结构)调用。

于 2013-08-21T07:12:46.137 回答
0

Component根据您提到的条件设置另一个可见。

  Component otherComponent = new Component ("otherComponent"){
     @Override
     protected void onConfigure() {
        super.onConfigure();
        setVisible(server.getStatus().getState().eqaulsIgnoreCase("OFF"));
     }
  };
于 2013-08-20T14:12:31.077 回答