Wicket:如何将模型更改传递给父组件? onModelChanged()不起作用

时间:2013-01-21 19:13:23

标签: model wicket onchange event-bubbling

我有一个包含许多TextFields表单的组件。 它应该工作的方式是,当更改时,值应该立即保持(没有保存按钮,全部通过AJAX)。

AJAX调用正常,值可以到达模型。

保存模型(以及包含的实体)的代码位于父组件中。 我以为我会覆盖onModelChanged()以将更改从组件传播到父组件。 但是没有调用onModelChanged()。

Parent有自己的模型作为类成员字段。 子组件使用此:

ReleaseTraitRowPanel( String id, IModel<IHasTraits> relModel, ... ) {
    ...
    PropertyModel<String> traitModel = new PropertyModel( relModel.getObject().getTraits(), prop);

    EditableLink4 link = new EditableLink4("link", traitModel){
        // Pass the change notification to upper level. TODO: Does Wicket do this automatically?
        @Override protected void onModelChanged() {
            ReleaseTraitRowPanel.this.onModelChanged();
        }
    };
    ...

}

应该怎么做? 我应该传递onModelChanged()吗?或者wicket是否有某种方式通知其他模型的变化?

相关 - 仅适用于表单的CompoundPropertyModel,还是可以将它与任何组件一起使用?我可以在这里使用它 - prop与id相同。

2 个答案:

答案 0 :(得分:1)

你使用了错误的方法,你应该使用modelChanged(),如果你看他的源代码是这样的

/**
 * Called to indicate that the model content for this component has been changed
 */
public final void modelChanged()
{
    // Call user code
    internalOnModelChanged();
    onModelChanged();
}

另一方面onModelChanged()是

/**
 * Called anytime a model is changed after the change has occurred
 */
protected void onModelChanged()
{
}

你可以看到onModelChanged()是对modelChanged()的调用。

CompoundPropertyModel可以在任何WebMarkUpContainer中使用;换句话说,在几乎每个容器中

答案 1 :(得分:1)

解决。问题是我有一个始终失败的Validator,并且在验证通过后调用了onModelChanged()。并且验证错误消息没有到达FeedbackPanel,因为它没有添加到AjaxRequestTarget ...

完成所有这些后,osdamv的回答也适用。 我写了一篇关于此的博客文章。 https://community.jboss.org/people/ozizka/blog/2013/01/21/wicket-creating-ajax-enabled-entity-based-pages