我在頁面上使用PropertyModel
來反映一些bean的屬性,有許多Wicket組件。使用AjaxFormComponentUpdatingBehavior
時,這些組件在用戶更改時通過Ajax自動更新。Apache Wicket:在模型更新之前響應Ajax請求
當屬性發生改變,我想用我的部件起火編輯PropertyChangeEvent
s表示應觸發豆謂監聽這些事件(實現PropertyChangeListener
)某些部件的重新呈現:
例子:
- 用戶編輯
TextField
與PropertyModel
和AjaxFormComponentUpdatingBehavior
- 的AJAX請求被髮送
- 檢票調度第r eQUEST的到
AjaxFormComponentUpdatingBehavior
- 行爲的
onEvent
更新PropertyModel
(不幸的是,這種方法是final
) - 的
PropertyModel
調用支持bean的屬性setter - 的支持bean火災和
PropertyChangeEvent
- 現在,我希望所有的組件聽同樣的支持豆的變化被通知
- 行爲調用摘要
onUpdate
,但現在是晚了,屬性更改事件已經處理。
由於我的bean不可序列化,所以我無法將組件永久註冊爲事件偵聽器。我需要註冊以某種方式檢索要通知的組件的代理對象,或者註冊我的組件暫時以獲取AJAX請求的範圍。
我想這樣做是掛接到圍牆門請求週期目標頁面已經被加載,但前阿賈克斯行爲更新模型,這將導致PropertyChangeEvent
後。在這裏,我可以將每個組件註冊爲其支持bean(addPropertyChangeListener
)上的事件偵聽器,以便在需要更新時通知它們。
然後,在onEvent
中,如果以前收到PropertyChangeEvent
,則每個組件都可以採取措施使用AjaxRequestTarget
進行更新。
最後,在onDetach
中,組件可以從它們的bean中取消註冊(removePropertyChangeListener
)。
不幸的是,我發現沒有內置的方式來獲取「關於Ajax請求」的通知。在我的Ajax行爲的onUpdate
方法中,模型已經更新,註冊更改偵聽器爲時已晚。我可以實現自己的行爲,但使用不同的組件選項(文本字段,選擇列表等),這是一項非常努力的工作。
我錯過了什麼嗎?
如果我理解正確,在您的方案中,支持bean負責將「更新自己」事件分發給註冊爲偵聽器的組件?爲什麼不能以相反的方式呢?如下所示:1)更新了bean; 2)發佈了「更新B豆屬性P」的檢票事件; 3)對該屬性感興趣的組件自己更新。 – bernie
我的支持bean(業務層)對Wicket組件(UI層)一無所知,我想保持這種狀態。問題依然如此:一個不在會話中的bean如何通知Wicket組件?我會不知何故需要檢索頁面,並通過ID找到組件? –
我並不是建議業務層應該控制UI。也許我是一個在這裏失蹤的人...我所建議的是,在更新bean之後,Wicket發佈一個Wicket事件,該事件被分發給每個組件,聲明「此Bean的屬性已更新」。然後組件自行決定是否應該刷新。 – bernie