gpt4 book ai didi

java - 为什么我的 Wicket 面板在更改默认模型后不重新渲染?

转载 作者:行者123 更新时间:2023-12-01 19:18:19 26 4
gpt4 key购买 nike

当带有 MessagePanel 的页面首次呈现时,消息和批准链接会完美呈现。当我单击批准链接时,所有业务逻辑都按预期工作,getNextMessage() 方法返回适当的对象,但消息面板不会在浏览器中的页面上更新。即消息体Label不更新。

JPAEntityModel 扩展了 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);
}

最佳答案

这是因为你没有正确使用模型。

该行获取面板模型对象的值(在构建期间设置),并使用它来创建组件模型。

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,仅在第一次单击链接后才强制使用。

关于java - 为什么我的 Wicket 面板在更改默认模型后不重新渲染?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5617983/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com