如何将视图与模型更改/重新呈现同步

时间:2017-12-12 22:39:36

标签: java wicket

我有一个包含文本字段输入的表单,该文本字段输入绑定到模型对象中的字段。当用户在该文本字段中输入数据时,它可以基于计算影响表单中的多个其他字段/组件。我的业务逻辑封装在服务层中。

理论上我希望这种方式工作的方式是,当用户更新字段时,会对服务器(在按键上)进行ajax调用,其中应用服务的逻辑并在模型对象上更新所有受影响的字段。在服务器上更新模型后,我想将模型对象的当前状态同步到屏幕。

这是刷新整个屏幕的唯一方法吗?有没有办法只重新渲染绑定到模型中已更改的字段的组件?此外,如果我刷新屏幕,正在编辑的字段也会更新,有没有办法将其排除?

我对这项技术的最佳实践感兴趣。

由于

2 个答案:

答案 0 :(得分:1)

使用Ajax,您可以更新所需的任何组件,只需确保它具有标记ID(Component.setOutputMarkupId(true))。

您需要使用AjaxFormComponentUpdatingBehaviorAjaxFormChoiceComponentUpdatingBehavior,并且在其onUpdate()回调中,您必须更新相应FormComponent的模型,然后您可以使用{{1访问当前Form的所有FormComponents并仅将AjaxRequestTarget添加到已更新的那些。

<强>更新 另一个好的解决方案(甚至更好!)是使用Wicket Event总线。在Ajax行为中,您可以广播一个事件:

FormComponent.this.getForm().visitChildren(FormComponent.class, IVisit)

其中component.send(getForm(), Broadcast.BREADTH, new UIChangedEvent(target, newValue)); 是您自己的类/ POJO,它带来了更新组件的新值和AjaxRequestTarget。

然后其他FormComponents可以覆盖UIChangedEvent并使用该值计算其新值并使用目标自行更新,具体取决于之前的计算。

答案 1 :(得分:1)

我从你的标签中假设你正在使用检票口。 Wicket为此目的使用Behaviors。在以下示例中,如果TextField的输入发生更改,您将更新DropDownChoices。您只需将这些控件添加到AjaxRequestTarget即可。 DropDownChoices的模型将在前端重新加载并重新渲染。另外,请确保在要更新的控件上调用setOutputMarkupId(true)。

$output="SELECT firstname, cnumber, raddress,pincode,state,country,heducation,ssc,practiceone,addressone,daysone,image 
    FROM doctor 
    JOIN addprofile ON doctor.id=addprofile.login_id 
    JOIN consultation ON doctor.id=consultation.login_id 
    ORDER BY id DESC";