Wicket & Javascript: има ли начин Wicket да получава известия за актуализиран текст?

Следната ситуация:

Приложението My Wicket работи в комбинация с javascript.

Има страница, която има например етикет. Този етикет има „ON“ като текстов набор:

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

server.getStatus().getState() ще върне "ON" в този момент.

Също така имам някакъв javascript на тази страница, който ще актуализира този етикет "serverState" на всеки 10 секунди. Може да е променено на „ИЗКЛЮЧЕНО“ (от javascript).

Моят въпрос е: има ли някакъв начин да получа известие за това „текстът на етикета е променен“. Имам нужда от това, защото искам да покажа (setVisible(true)) друг компонент, но само ако текстът е променен.


person DaUser    schedule 20.08.2013    source източник


Отговори (4)


Можете да добавите персонализиран AjaxEvent-Listener към вашия етикет. След това вашият 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');
  }
}
person Hans    schedule 21.08.2013

Бих използвал 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 функция, когато страницата се зареди, и 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"));
}
person papkass    schedule 21.08.2013

Задайте другото Component видимо от условието, което споменавате.

  Component otherComponent = new Component ("otherComponent"){
     @Override
     protected void onConfigure() {
        super.onConfigure();
        setVisible(server.getStatus().getState().eqaulsIgnoreCase("OFF"));
     }
  };
person Robert Niestroj    schedule 20.08.2013
comment
Това не е правилното поведение. Работи само ако натисна F5, за да презаредя страницата. (НЕ, дори F5, тъй като съдържа същия екземпляр на страницата, трябва да въведе URL адреса на ръка) Но се актуализира чрез javascript. Това не принуждава презареждане на страницата. JS фрагмент: xxx.find(.textToUpdate).text(server.status.state); Както можете да видите, той търси само контейнера с този идентификатор и задава правилния текст. Wicket не е получил известие досега. - person DaUser; 20.08.2013
comment
Как актуализирате етикета serverState? Тъй като, както казахте, това е екземпляр от една страница и се съмнявам, че вашият JavaScript някога ще промени показаната стойност. Препоръчвам на това актуализиране на етикета i и превключване на дисплея на другия компонент по Wicket начин. - person Robert Niestroj; 20.08.2013
comment
Актуализира се с javascript: изглежда като: $(document).ready(function() { loadServerState(); window.setInterval(loadServerState, 5000); } var loadServerState() = function() { var x = $(# + server .id); ... x.find(.textToUpdate).text(server.status.state); //търсете етикета за актуализиране } - person DaUser; 21.08.2013
comment
Предлагам да използвате, както каза Буурман, AjaxSelfUpdatingTimerBehavior, да конфигурирате компоненти, както ви показах, и да направите всичко това в Java - The Wicket Way. - person Robert Niestroj; 21.08.2013
comment
Да, звучи като правилния начин. Използвам този js, защото вече беше там (мигриран проект от jsp към wicket). Но мисля, че скоро трябва да го сменя... The Wicket Way звучи по-умно ;) - person DaUser; 21.08.2013

Wicket е уеб рамка от страна на сървъра. За да промени съдържанието или видимостта на компонентите, той трябва да знае за променените условия от страната на сървъра.

Ако приемем, че server.getStatus().getState() на сървъра ще отразява промените, които споменахте, можете да използвате AjaxSelfUpdatingTimerBehavior, за да актуализирате (подмножество от) компонентите на страницата на всеки X секунди/минути/и т.н. (Базирано е на Duration).

РЕДАКТИРАНЕ: И когато компонентът е актуализиран (добавен към ajaxrequest), можете да използвате отговора на Robert Niestroj, за да настроите втория компонент, видим, тъй като onConfigure ще бъде извикан за всеки компонент, който е добавен към ajarequest (директно или чрез йерархия).

person Buurman    schedule 21.08.2013