Wicket - 在AjaxSelfUpdatingTimerBehavior事件上显示带有表单组件的模态窗口不会填充用户选择

时间:2016-01-12 17:21:42

标签: java wicket wicket-6

我有一种情况,我试图在Wicket 6 ModalWindow上显示输入表单。

目前,这是一个非常简单的表单,其中有一个组中有三个单选按钮,用于使工作正常。

// 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(&#34; onchange&#34;)的Radio,它找到父无线电组并调用group.processInput后跟onInputChanged)

如果我在正常情况下显示此对话框(例如onClick on a 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

我正在使用wicket 6.19.0和Java 7

实施的原因 - 我将做一个很长的导入任务,有时可能需要向用户询问一个问题,因此行为将扫描问题并在任务等待答案时显示对话框。

请有人帮我这个吗?

1 个答案:

答案 0 :(得分:0)

发现问题。

基本上,在屏幕上存在AjaxSelfUpdatingTimerBehavior的任何情况下都会失败。这是因为onTimer实现将组件添加到目标,无论如何,我不想这样做,因为这会重置所有输入。由于它的持续时间为1秒,因此在重新选择所有选项之前没有机会关闭对话框。

如果我用AbstractAjaxTimerBehavior替换它,它可以正常工作,虽然我认为以后当我需要停止计时器时可能会出现问题。