我有一个包含文本字段输入的表单,该文本字段输入绑定到模型对象中的字段。当用户在该文本字段中输入数据时,它可以基于计算影响表单中的多个其他字段/组件。我的业务逻辑封装在服务层中。
理论上我希望这种方式工作的方式是,当用户更新字段时,会对服务器(在按键上)进行ajax调用,其中应用服务的逻辑并在模型对象上更新所有受影响的字段。在服务器上更新模型后,我想将模型对象的当前状态同步到屏幕。
这是刷新整个屏幕的唯一方法吗?有没有办法只重新渲染绑定到模型中已更改的字段的组件?此外,如果我刷新屏幕,正在编辑的字段也会更新,有没有办法将其排除?
我对这项技术的最佳实践感兴趣。
由于
答案 0 :(得分:1)
使用Ajax,您可以更新所需的任何组件,只需确保它具有标记ID(Component.setOutputMarkupId(true)
)。
您需要使用AjaxFormComponentUpdatingBehavior
或AjaxFormChoiceComponentUpdatingBehavior
,并且在其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";