2016-01-12 3 views
0

У меня есть ситуация, когда я пытаюсь отобразить форму ввода в Wicket 6 ModalWindow.Wicket - отображение модального окна с компонентами формы на AjaxSelfUpdatingTimerBehavior событие не заполняет выбор пользователя

В настоящее время это очень простая форма с тремя переключателями в группе на ней для получения работы.

// in TestPanel.class, the content of TestDialog: 
protected void onInitialize() { 
    super.onInitialize(); 

    RadioGroup<Integer> group = new RadioGroup<Integer>("group", _model); 
    getForm().add(group); 

    group.add(new AjaxRadio<Integer>("g1", Model.of(1)) { 

    private static final long serialVersionUID = 1L; 

    @Override 
    protected void onInputChanged(AjaxRequestTarget target) { 
     System.out.println(getMarkupId() + " clicked, Input is now " + _model.getObject()); 
    }  
    }); 
    // + 2 more other similar radio buttons.. 
} 

(AjaxRadio просто радио с AjaxEventBehavior («OnChange») добавил, что находит родительский RadioGroup и вызывает group.processInput с последующим onInputChanged)

Если я показывать этот диалог при нормальных условиях (например, onClick на AjaxLink), диалог отобразится отлично, и модель правильно обновлена.

actionsForm.add(new AjaxLink<Object>("link") { 

    private static final long serialVersionUID = 1L; 

    @Override 
    public void onClick(AjaxRequestTarget target) { 
    TestDialog dialog = getDialog(TestDialog.class, target); 
    dialog.show(target); 
    } 
}); 

g1182 clicked, Input is now 1 
g2183 clicked, Input is now 2 
g3184 clicked, Input is now 3 

Если я показываю диалог в качестве AjaxSelfUpdatingTimerBehavior.onPostProcessTarget, модель формы компонента никогда не обновляется!

protected void onInitialize() { 
    super.onInitialize(); 

    add(new AjaxSelfUpdatingTimerBehavior(Duration.ONE_SECOND) { 

     private static final long serialVersionUID = 1L; 

     @Override 
     protected void onPostProcessTarget(AjaxRequestTarget target) { 

     if(displayDialog() && dialogNotDisplayedYet()) { 
      TestDialog dialog = getDialog(TestDialog.class, target); 
      dialog.show(target); 
     } 
     } 
    }); 
    } 

getDialog создает ModalWindows и добавляет их в дерево компонентов. Я попытался добавить диалоги в нужную вам ситуацию (как указано выше) или создать диалог во время onInitialize, а затем просто показывать в onPostProcessTarget. Не имеет никакого значения.

g1182 clicked, Input is now null 
g2183 clicked, Input is now null 
g3184 clicked, Input is now null 

Я использую калитку 6.19.0 и Java 7

причина реализации - я буду делать длинную задачу импорта, которая может время от времени нужно задать пользователю вопрос, поэтому поведение просканирует вопросы и представить диалог, пока задача ждет ответа.

Пожалуйста, помогите мне с этим?

+0

Проверьте, есть ли параметр запроса для имени/значения радио в вызове Ajax. Также попробуйте остановить поведение таймера во время открытия диалога и перезапустить его после закрытия диалога. –

+0

Не уверен, какие параметры вы имеете в виду - я проверил target.getPageParameters(). GetNamedKeys(), и в обеих ситуациях это было пустым. – fancyplants

ответ

0

Обнаружена проблема.

В принципе, это провалится в любой ситуации, когда на экране есть AjaxSelfUpdatingTimerBehavior. Это связано с тем, что реализация onTimer добавляет компонент в цель независимо от того, что я не хотел делать, поскольку это сброс всех входов. Поскольку у него была продолжительность 1 секунда, не было возможности закрыть диалог после выбора выбора, прежде чем он снова будет сброшен.

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

+0

Правильно. 'AjaxSelfUpdatingTimerBehavior' всегда будет обновлять компонент, к которому он привязан в данный интервал, в то время как метод' onPostProcessTarget' обеспечивает крючок для дополнительной логики обновления. Если вы хотите остановить «AbstractAjaxTimerBehavior», просто сохраните экземпляр переменной и вызовите 'beh.stop();' на нем или вызовите 'this.stop();' из метода 'onTimer'. – Imperative