爲什麼吐一些XML?大概是更新模型或視圖,是嗎?
Wicket的優勢在於您不必擔心呈現的HTML。在Model-View-Controller術語中,您將Controller設置爲正確修改Model,Wicket負責View。
分離不是完全是明確:事實上,您可以顯示/隱藏視圖組件,或更改,然後可以視爲更改視圖。
但是你通常不需要做的就是直接管理瀏覽器或javascript。 Wicket會照顧到這一點,如果你照顧你在Java代碼中的修改。
在Wicket中,Ajax將使用AjaxRequestTarget目標在您的AjaxBehavior上調用一個方法。
在該方法中(或從其中調用的方法中),您可以執行任何需要執行的操作,更新模型或視圖,然後向目標添加已更改的任何視圖組件。 Wicket負責更新瀏覽器。
下面是一個例子。它取自我的一些代碼,但嚴重改變只是爲了使說明更清晰。這個想法很簡單:「鏈接」下拉選擇,其中當父項中的選擇選項更改時,子項中的選項發生更改,如在[州] [縣] [區]系列中。
(在實際的類中,模型的變化傳遞給了孩子,孩子自己決定是否已經改變了,並且自己添加到了目標中,然後將目標傳遞給它的孩子。大部分是做一個更清晰的例子)
這裏的構造函數,這只是增加了自身的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樣式的行爲,甚至將一個Panel換成另一個Panel。只要對每個更改的組件我們: 1)調用setOutputMarkupId(true);從而使JavaScript可以找到它, 2)把它添加到AjaxRequestTarget
注意,阿賈克斯行爲的不同類型(subclases)有不同的回調函數,所以要確保你覆蓋了正確的(加一個@如果名稱錯誤,覆蓋註釋以便編譯器可以投訴)。
但是,基本檢票的想法是,您不必爲客戶端發送原始數據來解析並採取行動,而是更新模型和視圖,並告訴Wicket重新呈現已更改的內容,方法是添加chnaged組件到目標。
我能想到發送直接XML的唯一原因是要將它提供給非Wicket javascript。讓我知道如果這是你的目標,我完全錯過了這一點。 ;)
僅供參考,您的javascript散發出現錯誤。你錯過了右手paren和分號,但是你還缺少提供的字符串引號。 ... ...新的談話人(\「」+ this.talker.getCallbackURL()+「\」);「;或類似的東西。 – davenpcj 2008-10-20 15:43:19