2013-03-05 2 views
1

У меня есть эта ситуация:калитка индикатор ajax

У меня есть IndicatingAjaxButton. В методе onSubmit выполняются некоторые операции, а затем setResponsePage(otherPage); называется

Пока операции все еще продолжаются, индикатор занятости отображается. Но тогда, когда операции выполняются, индикатор исчезает, пока пользователь все еще находится на одной странице, способный выполнять другие действия, в то время как браузер занят открытием другой страницы.

Мой вопрос заключается в том, как сделать индикатор все еще видны, пока браузер занят открытия otherPage.

Спасибо

+0

Я плохо понимаю, но вы можете сделать видимым индикатор с JS, независимо от состояния в контроллере. – osdamv

ответ

1

Прежде всего, вы должны убедиться, что вам действительно нужно сделать это в запросе ajax. Я бы не счел нужным, если вы делаете setResponsePage() только в зависимости от определенных условий, а также выполняете некоторую операцию Ajaxy.

Если вам не нужен Ajax, я бы рекомендовал отказаться от него и просто отправить обычный запрос. Вы можете закодировать клиента индикатора занятости или Wicket и показать его с помощью javascript (возможно, в body.onunload для общего способа?).

Но если вы действительно этого хотите, вы должны понять, почему индикатор скрыт. Wicket подготавливает javascript, который будет выполнен после завершения вызова (успех или неудача). Соответствующий метод AbstractDefaultAjaxBehavior#generateCallbackScript():

final CharSequence onSuccessScript = getSuccessScript(); 
final CharSequence onFailureScript = getFailureScript(); 
... 
if (!Strings.isEmpty(indicatorId)) 
    { 
    String hide = ";wicketHide('" + indicatorId + "');"; 
    success = success + hide; 
    failure = failure + hide; 
} 

Здесь калитка готовит яваскрипт wicketHide(id) вызова, который будет эффективно скрыть индикатор после того, как запрос будет завершен (и на Sucess или неудачу).

Я никогда не пытался это сделать, но, вероятно, перекрывая getFailureScript() и getSuccessScript(), чтобы сделать сценарий return перед выполнением wicketHide(id), в вашем поведении Ajax должен сделать трюк:

protected CharSequence getSuccessScript() { 
    String script = super.getSucessScript(); 
    return (script != null ? script : "") + ";return false;"; 
} 
protected CharSequence getFailureScript() { 
    String script = super.getFailureScript(); 
    return (script != null ? script : "") + ";return false;"; 
} 

Обратите внимание, что всегда оставит показанный индикатор и никогда не скрывать его. Если вы хотите условно скрыть это или нет, в зависимости от того, выполняется ли setResponsePage или нет, вы можете, например, определить переменную js с помощью AjaxRequestTarget и return условно в ваших реализацияхи getFailureScript().

Источники калитки (по крайней мере для меня) удивительно ясны, чтобы читать и понимать. Они могут помочь вам понять, как это работает, и как вы можете настроить его в соответствии с вашими потребностями.

+0

Благодарим вас за ответ. Я не знаю, работает ли это решение для меня, потому что только это не так, так как индикатор остается невидимым, пока страница все еще занята, открывая другую страницу. Поэтому я не знаю, как getSuccessScript() и getFailureScript() могут мне помочь. Мне нужно, чтобы индикатор включался, когда браузер занят открытием другой страницы. – mnish

+0

Переопределение 'getFailureScript()' и 'getSucessScript()', чтобы сделать javascript 'return' перед выполнением' wicketHide (id) ', поможет избежать скрыть индикатор. Если индикатор не скроется, он останется включенным до следующей загрузки страницы.Но, если вы хотите показать индикатор при выходе из страницы, вы можете просто добавить обработчик событий «onunload» javascript на '' и затем показать индикатор. –