Java Wicket主页初始加载时未更新的模型

Java Wicket主页初始加载时未更新的模型,java,firefox,wicket,page-lifecycle,Java,Firefox,Wicket,Page Lifecycle,我在理解我做错了什么方面遇到了一些问题 我的工作: 在我的应用程序中重写getHomePage()。我返回MyStartPage.class MyStartPage是MySubPage的一个子类 MySubPage是MySuperPage的一个子类 在MySuperPage中,我添加了一个面板。此面板有一个TextField和WebMarkupContainer,其中包含一个AjaxEventBehavior(onclick),用于打印TextField的backing modelObject

我在理解我做错了什么方面遇到了一些问题

我的工作:

  • 在我的应用程序中重写getHomePage()。我返回MyStartPage.class
  • MyStartPage是MySubPage的一个子类
  • MySubPage是MySuperPage的一个子类
  • 在MySuperPage中,我添加了一个面板。此面板有一个TextField和WebMarkupContainer,其中包含一个AjaxEventBehavior(onclick),用于打印TextField的backing modelObject
启动服务器并浏览localhost/MyApp时会发生什么:

  • 即使单击WebMarkupContainer时用户输入不是空的,打印的modelObject也是空的
当我启动服务器,浏览localhost/MyApp,转到我应用程序中的另一个页面,然后返回MyStartPage:

  • 单击WebMarkupContainer时,打印的modelObject与用户输入匹配
当我执行以下操作时,它也会起作用:

  • 在我的应用程序中重写getHomePage()并返回MyLoginPage。MyLoginPage包含MySigninPanel。在MySigninPanel中,我覆盖OnSignensAcceded(),如下所示:

    @Override
    protected void onSignInSucceeded() {
         setResponsePage(new MyStartPage());
    }
    
当用户第一件事就是单击WebMarkupContainer时,有没有人能解释一下让我的文本字段正常工作的正确方法

提前谢谢

//编辑:


这似乎只是Firefox中的一个问题,或者至少它在IE9中的Chrome IE9和IE8模式下工作正常。

除非您提交带有单击事件的表单,否则您的文本字段的模型不会用用户输入的数据更新。您的文本字段应该是该表单的子字段。如果是,则其内容将被发送到服务器,转换为目标类型,并进行验证。成功后,您将能够查询模型并查看页面上输入的数据

为此,应使用AjaxFormSubmitBehavior,而不是当前使用的AjaxEventBehavior:

webMarkupContainer.add(new AjaxFormSubmitBehavior(form, "onclick") {

    @Override
    protected void onSubmit(AjaxRequestTarget target) {
        // You can now see what was entered in your TextField
        System.out.println(textField.getModelObject());
    }

    @Override
    protected void onError(AjaxRequestTarget target) {
        // An error occurred and you should provide some kind of feedback
    }
});

嗯,我有一个解决办法,虽然我不知道为什么它会起作用。我补充说

mountPage(“发票/概述”,概述页.class)

在我的Web应用程序中,现在它可以在FireFox中使用(概览页面在我的第一篇文章中被称为“MyStartPage”)

以下是wicket.ajax.baseurl和浏览器中键入的url在更改之前的样子(当它不起作用时):

baseUrl:
wicket/bookmarkable/eyesys.web.invoice.overview.OverviewPage

浏览器url:
wicket/bookmarkable/eyesys.web.invoice.overview.OverviewPage?1

更改后:

baseUrl:
发票/概览


浏览器url:
发票/概述?1

感谢您的回复。我正在检查我的代码,实际上我就是这么做的(我尝试使用AjaxEventBehavior并向文本字段添加AjaxFormComponentUpdateingBehavior(onchange),但这也不起作用)。通过您的示例,我了解了为什么当我单击系统中的另一个链接时,它会开始工作,但是每次更改输入后,如果我不这样做,textField的modelObject就不会更改。我看到的是,在我单击另一个链接后,它每次都会工作,包括AjaxEventBehavior和AjaxFormSubmitBehavior。有什么想法吗?