2011-04-11 75 views
0

當帶有MessagePanel的頁面首先呈現時,消息和批准鏈接將完美呈現。當我點擊Approve鏈接時,所有的業務邏輯都按照需要工作,getNextMessage()方法返回適當的對象,但消息面板不會在瀏覽器的頁面上更新。也就是說,郵件正文標籤不會更新。更改默認模型後,爲什麼我的Wicket Panel無法重新渲染?

JPAEntityModel extends LoadableDetachableModel。

我缺少什麼?我該如何解決它?

public class MessagePanel(String id, IModel<Message> messageModel) extends Panel { 
    super(id, messageModel); 
    add(new Label("messageText", new PropertyModel<Message>(getModelObject(), Message.BODY_FIELD))); 
    add(new IndicatingAjaxFallbackLink<User>("approveLink", new JPAEntityModel<User> (getActiveUser())) { 
    @Override 
    public void onClick(AjaxRequestTarget target) { 
     Message nextMessage = getNextMessage(); 
     MessagePanel.this.setDefaultModel(new JPAEntityModel<Message>(nextMessage)); 
     target.add(MessagePanel.this); 
    } 
}); 
    setOutputMarkupId(true); 
} 

回答

4

這是因爲你沒有正確使用模型。

該行採用面板的模型對象的值,因爲它在構建期間設置爲,並使用它創建組件模型。

add(new Label("messageText", new PropertyModel<Message>(getModelObject(), Message.BODY_FIELD))); 

更糟糕的是,當你點擊鏈接時,面板被賦予了新的模式:

MessagePanel.this.setDefaultModel(new JPAEntityModel<Message>(nextMessage)); 

但這顯然不會影響標籤的模型,因爲它已經是設置爲參考原始值。

所以有兩件事你需要改變才能使它工作。首先,你的標籤模型應該直接使用你的面板型號:

new Model<Message>() { 
    @Override 
    public Message getObject() { 
    return MessagePanel.this.getModelObject().getMessage(); //or something similar 
    } 
} 

(注:上面的代碼不一定是最好的解決辦法,但它是演示瞭如何模型可以動態地使用一個有效的解決方案)

理想情況下,您不應該在單擊鏈接時替換模型,只需更改模型對象即可。如果您需要自定義模型類(JPAEntityModel),則無論如何您都不應該在面板構造函數中接受預構建模型,而只需接受第一個消息對象。原因是當前的實施方式並不強制從一開始就使用JPAEntityModel,只有在第一次點擊鏈接之後。

+0

那麼如何讓標籤刷新,從新模型對象中提取數據呢? – Instantsoup 2011-04-11 09:14:21

+2

改爲使用新的PropertyModel (getModel(),...)。 – 2011-04-11 09:17:10

+0

@Martijn Dashorst這確實是理想的解決方案,但只有修改鏈接以避免調用'setDefaultModel()'。 – biziclop 2011-04-11 09:28:09

0

在將其添加到目標之前,您可以嘗試調用MessagePanel.this.modelChanged()嗎?

+0

這並不會改變任何事情。我爲這個例子增加了一點,也許這會增加光線。 – Instantsoup 2011-04-11 08:25:31

0

您必須使用呼叫setOutputMarkupId(true)MessagePanel。該面板需要有一個標記標識符才能夠在瀏覽器中更新標記DOM。

+0

哎呀,忘了補充一點。我確實擁有它。 – Instantsoup 2011-04-11 09:13:07

相關問題