维克特酒店;Javascript:Wicket有没有办法得到更新文本的通知?

维克特酒店;Javascript:Wicket有没有办法得到更新文本的通知?,javascript,events,label,wicket,updating,Javascript,Events,Label,Wicket,Updating,以下情况: 我的Wicket应用程序与javascript结合使用 例如,有一个带有标签的页面。此标签将“ON”作为文本集: Label state = new Label("serverState", server.getStatus().getState()); server.getStatus().getState()此时将返回“开” 另外,我在这个页面上有一些javascript,它将每10秒更新一次这个“serverState”标签。它可能已被更改为“关闭”(通过javascript

以下情况:

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

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

Label state = new Label("serverState", server.getStatus().getState());
server.getStatus().getState()此时将返回“开”

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


我的问题是:有没有办法得到“标签文本已更改”的通知。我需要它,因为我想显示(setVisible(true))另一个组件,但仅当文本已更改时才显示。

根据您提到的条件设置另一个
组件

  Component otherComponent = new Component ("otherComponent"){
     @Override
     protected void onConfigure() {
        super.onConfigure();
        setVisible(server.getStatus().getState().eqaulsIgnoreCase("OFF"));
     }
  };

将所述条件下的另一个
组件设置为可见

  Component otherComponent = new Component ("otherComponent"){
     @Override
     protected void onConfigure() {
        super.onConfigure();
        setVisible(server.getStatus().getState().eqaulsIgnoreCase("OFF"));
     }
  };

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

假设服务器上的server.getStatus().getState()将反映您提到的更改,您可以使用
ajaxselfUpdatengTimerBehavior
每隔X秒/分钟/等更新页面上的组件(一个子集)(它基于
持续时间


编辑:当组件被更新(添加到ajaxrequest中)时,您可以使用Robert Niestroj的答案将第二个组件设置为可见,因为对于添加到ajarequest的每个组件(直接或按层次结构)都将调用配置。Wicket是一个服务器端web框架。为了更改组件的内容或可见性,它需要了解服务器端更改的条件

假设服务器上的server.getStatus().getState()将反映您提到的更改,您可以使用
ajaxselfUpdatengTimerBehavior
每隔X秒/分钟/等更新页面上的组件(一个子集)(它基于
持续时间


编辑:当组件被更新(添加到ajaxrequest中)时,您可以使用Robert Niestroj的答案将第二个组件设置为可见,因为对于添加到AjarRequest中的每个组件(直接或按层次结构)都将调用配置。我将使用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)时使用javascript;具有新的值

@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"));
}

我将使用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)时使用javascript;具有新的值

@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"));
}

您可以将自定义AjaxEvent侦听器添加到标签中。然后,Javascript应在将开关从ON切换到OFF并返回后触发该事件:

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');
  }
}

您可以将自定义AjaxEvent侦听器添加到标签中。然后,Javascript应在将开关从ON切换到OFF并返回后触发该事件:

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');
  }
}

那不是正确的行为。只有当我按“F5”重新加载页面时,它才起作用。(不,甚至不是F5,因为它持有相同的页面实例,必须手动输入url),但它是通过javascript更新的。这不会强制重新加载页面。JS代码段:“xxx.find(“.textToUpdate”).text(server.status.state);”正如您所见,它只搜索具有此id的容器并设置正确的文本。Wicket目前还没有收到通知。如何更新“serverState”标签?因为正如您所说,这是一个页面实例,我怀疑您的JavaScript是否会改变显示的值。我建议更新标签I并切换另一个组件“Wicket way”的显示。它用javascript更新:类似:$(document).ready(function(){loadServerState();window.setInterval(loadServerState,5000);}var loadServerState()=function(){var x=$(“#”+server.id);…x.find(“.textToUpdate”).text(server.status.state);//查找要更新的标签}我建议使用Buurman说的AjaxSelfUpdatengTimerBehavior,像我演示的那样配置组件,并用Java“Wicket方式”完成所有操作。是的,听起来是正确的方式。我使用js是因为它“已经存在”(将项目从jsp迁移到wicket)。但我想我必须尽快更改它…“wicket方式”听起来更聪明;)这不是正确的行为。只有当我按“F5”重新加载页面时,它才能工作。(不,甚至F5也不行,因为它持有相同的页面实例,必须手动输入url)但它是通过javascript更新的。这不会强制页面重新加载.JS代码段:“xxx.find(“.textToUpdate”).text(server.status.state);”正如您所见,它只搜索具有此id的容器并设置正确的文本。Wicket到目前为止没有收到通知。如何更新“serverState”标签?因为正如您所说,这是一个页面实例,我怀疑您的JavaScript是否会更改显示的值。我建议您更新标签i并切换另一个组件“Wicket way”的显示。它使用JavaScript更新:类似:$(document).ready(function(){loadServerState();window.setInterval(loadServerState,5000);}var loadServerState()=function(){var x=$(“#”+server.id);…x.find(“.textToUpdate”).text(server.status.state);//查找要更新的标签}我建议使用Buurman所说的AjaxSelfUpdatengTimerBehavior
,像我展示的那样配置组件,然后用Java“Wicket方式”完成所有操作。是的,听起来是正确的方式。我使用js是因为它“已经存在”(将项目从jsp迁移到Wicket)。但我想我必须很快改变它……”