2012-05-28 37 views
0

我有ListView和验证页面上的问题。Apache wicket:如何明确更新表单?

我有ListView,在它下面我有TextField,用户可以在其中输入值。我在我的页面上有“发布”和“草稿保存”按钮。发布是一个按钮,其中显示弹出窗口(ModalWindow),其中用户应该确认输入的数据。保存草稿未经确认即保存。两者都是SecuredAjaxLink对象。

当用户在TextField中输入数据时,它将保存在ListView中,但整个列表不会更新,因为用户应按下面的Add按钮。还行吧。

问题是,我有业务验证,其中用户输入的信息检查了一些规则。当验证失败时,所有字段(包含错误的信息)都用css突出显示。要明确地将TextField中的值添加到ListView中,我正在做

target.addComponent(form); 

这是在数据进入验证之前执行的。所以所有的字段都会更新。这适用于发布按钮(具有确认ModalWindow),但不适用于没有弹出窗口的链接。据我了解,目标的生命周期有问题,但我坚持了它。

也许有人有类似的东西,或知道答案吗?

如何在不使用弹出窗口的情况下更新页面?

下面是代码:链接 草案:

add(new SecuredAjaxSubmitLink(LinkNames.savelaterLink.toString(), form, 
       RoleController.CONTROLLER.getAccessController()) { 
      @Override 
      public void onSubmit(AjaxRequestTarget target, Form form) { 
       target.addComponent(form); 
       insert(appl, false, form, target, new MainMenu(getString("accept.application.draft.success.message")), trail, checkbox); 
      } 

发布链接:

add(new CustomAjaxSubmitLink(LinkNames.submitLink.toString(), form, 
       RoleController.CONTROLLER.getAccessController()) { 
      @Override 
      protected void onSubmit(AjaxRequestTarget target, Form form) { 
       target.addComponent(form); 
       publishPopup.show(target); 
      } 
     }); 

publishPopup.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() { 
      public void onClose(AjaxRequestTarget target) { 
       if (ApplicationInsertActionPanel.this.getSelectedAction() != null 
         && ApplicationInsertActionPanel.this.getSelectedAction().equals(Action.CONFIRM)) { 
        insert(appl, 
          true, 
          form, 
          target, 
          new MainMenu(ApplicationInsertActionPanel.this 
            .getString("accept.application.publish.success.message")), trail, checkbox); 
       } 

      } 
     }); 

我添加

@Override 
      protected void onError(final AjaxRequestTarget target, Form<?> form) 
      { 
       super.onError(target, form); 
       target.addComponent(form); 

到我的链接草案,但仍然页面没有完全更新。 我想这是因为目标的生命周期没有结束,就像是当我使用弹出窗口结束。弹出式窗口打开“新页面”,旧的目标可以更新,但是当我不使用弹出窗口时,页面保持原样。 所以现在我想一些解决办法来结束生命周期的目标。我在想没有任何功能的透明弹出式窗口,但真的很脏解决方案。

任何想法?谢谢! }

+0

你能展示一些代码吗? – bert

+0

已编辑的第一篇文章。 – psisoyev

回答

0

我的英语不太好,我完全不了解你的职位。 是不是: 在Textfield中键入单词 - >其中一个提交按钮 - >单词出现在listview上? 如果你想你为什么不使用从IValidator.class

继承,如果你想更新您的表格,您可以将updatebehaviour添加到您的形式

final AjaxFormSubmitBehavior   formbehavior = new AjaxFormSubmitBehavior("onChange") { 
    @Override 
    protected void onError(AjaxRequestTarget arg0) { 
     arg0.add(getForm()); 
    } 

    @Override 
    protected void onSubmit(AjaxRequestTarget arg0) { 
     arg0.add(getForm()); 
    } 
}; 

类验证输入,那么你可以添加此行为的形式或将其扩展到您的需求

form.add(formbehavior) 

我不知道您的问题以某种方式与我的答案,但我想你想知道如何在不加载页面新的更新您的形式。

+0

感谢您的回答。我试图实现类似的行为,但我失败了。有这样的逻辑: 在TextField中输入单词 - >单词被添加到ListView中,但它没有更新,如果用户想要添加新的,他必须按下ListView下面的按钮ADD。并且保留在TextField中的最后一个元素将添加到ListView中。 - >用户按下按钮保存草稿/发布 - >模型对象被发送到业务逻辑进行验证 - >逻辑失败并且发布页面被更新并且listview完全更新,但是草稿链接 - 不是。列表已更新,但未通过验证突出显示(最后一个元素) – psisoyev

+0

您的示例代码比帮助更刺激,显示Textfield的代码,ListView也是如此,它们的模型以及它们的行为和链接。如果我了解它,你的问题是草案链接(为什么没有按钮?),验证后列表ist没有突出显示的错误。那么该如何突出显示该列表?红色?你是否试图写自己的验证器?也许你可以制作你的意思的截图,让你可以想象,你想要什么。 – Sven

相关问题