吐出一些 XML 做什么?大概是为了更新模型或视图,是吗?
Wicket 的优势在于您不必担心呈现的 HTML。在模型-视图-控制器术语中,您设置控制器以正确修改模型,而 Wicket 负责视图。
分离并不完全清楚:实际上您可以显示/隐藏视图组件,或者然后更改,这可以看作是更改视图。
但是您通常不必做的是直接管理浏览器或javascript。如果您注意在 Java 代码中进行更改,Wicket 会处理这些。
在 Wicket 中,Ajax 将使用 AjaxRequestTarget 目标调用 AjaxBehavior 上的方法。
在该方法(或从它调用的方法中)中,您可以做任何您需要做的事情,更新模型或视图,然后将任何已更改的视图组件添加到目标中。Wicket 负责更新浏览器。
这是一个例子。它取自我做的一些代码,但为了使解释更清楚而进行了大量修改。这个想法很简单:“链式”下拉选择,当父项中的选择选项发生变化时,子项中的选项会发生变化,如 [州] [县] [区] 的系列。
(在实际的类中,模型更改被传递给孩子,孩子自己决定是否发生了变化,如果有,则将自己添加到目标中,然后将目标传递给它的孩子。我已经删除了大部分举个更清楚的例子。)
这是 ctor,它只是给自己添加了一个 AjaxBehavior 的匿名子类:
public AjaxChildNotifyingDropDownChoice(...code elided for clarity...) {
this.child = child;
// Ajax won't work without this:
setOutputMarkupId(true);
//
add( new OnChangeAjaxBehavior() {
@Override
public void onUpdate(final AjaxRequestTarget target) {
// tell child to update its list
// based on newly selected value
// when the Ajax is called,
// my owning component's model
// is already updated
// note we could just type getModel()
// I'm making explicit that we're calling it
// on the enclosing class
// (which a non-static inner class has a hidden ref to)
child.setNewModelBasedOnSelectionOf(
AjaxChildNotifyingDropDownChoice.this.getModel());
// now add the child to the target
// Wicket javascript will receive the new
// options and re-render the child dropdown
target.add(child);
}
});
}
我们还可以隐藏或取消隐藏组件,或添加 CSS 样式等行为,甚至将一个面板换成另一个面板。只要对于每个更改的组件,我们: 1) 调用 setOutputMarkupId(true); 以便 javascript 可以找到它,并且 2) 将其添加到 AjaxRequestTarget
请注意,Ajax 行为的不同类型(子类)具有不同的回调函数,因此请确保您覆盖了正确的回调函数(添加一个 @Override 注释,以便编译器在名称错误时会抱怨)。
但同样,基本的 wicket 想法是,不是将原始数据发送给客户端进行解析和操作,而是更新模型和视图,并告诉 Wicket 重新渲染您所做的更改,方法是将已更改的组件添加到目标。
我能想到直接发送 XML 的唯一原因是将其提供给非 Wicket javascript。让我知道这是否是你的目标,我完全错过了重点。;)