我有一个包含许多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相同。
答案 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