Java 为什么';更改默认型号后,我的导叶面板是否重新启动?

Java 为什么';更改默认型号后,我的导叶面板是否重新启动?,java,ajax,jpa,wicket,Java,Ajax,Jpa,Wicket,当带有MessagePanel的页面第一次呈现时,消息和approve链接呈现得非常完美。当我单击approve链接时,所有的业务逻辑都会按需要工作,getNextMessage()方法会返回相应的对象,但是浏览器页面上的消息面板不会更新。也就是说,消息正文标签不会更新 JPAEntityModel扩展了LoadableDetachableModel 我错过了什么?我该如何修复它 public class MessagePanel(String id, IModel<Message>

当带有MessagePanel的页面第一次呈现时,消息和approve链接呈现得非常完美。当我单击approve链接时,所有的业务逻辑都会按需要工作,
getNextMessage()
方法会返回相应的对象,但是浏览器页面上的消息面板不会更新。也就是说,消息正文标签不会更新

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);
}
public类MessagePanel(字符串id,IModel messageModel)扩展了该面板{
super(id,messageModel);
添加(新标签(“messageText”,新属性模型(getModelObject(),Message.BODY_字段));
添加(新的指示符gajaxfallbacklink(“approveLink”,新的JPAEntityModel(getActiveUser())){
@凌驾
公共void onClick(AjaxRequestTarget目标){
Message nextMessage=getNextMessage();
MessagePanel.this.setDefaultModel(新的JPAEntityModel(nextMessage));
target.add(MessagePanel.this);
}
});
setOutputMarkupId(真);
}

在将其添加到目标之前,您可以尝试调用
MessagePanel.this.modelChanged()
吗?

在将其添加到目标之前,您可以尝试调用
MessagePanel.this.modelChanged()
吗?

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

该行获取面板模型对象的值,即在构造过程中设置的值,并使用该值创建构件模型

add(new Label("messageText", new PropertyModel<Message>(getModelObject(), Message.BODY_FIELD)));
add(新标签(“messageText”,新属性模型(getModelObject(),Message.BODY_字段));
更糟糕的是,当您单击该链接时,面板将显示一个新模型:

MessagePanel.this.setDefaultModel(new JPAEntityModel<Message>(nextMessage));
MessagePanel.this.setDefaultModel(新的JPAEntityModel(nextMessage));
但这显然不会影响标签的模型,因为它已经设置为引用原始值

因此,有两件事你需要改变才能让它发挥作用。首先,标签模型应直接使用面板模型:

new Model<Message>() {
  @Override
  public Message getObject() {
    return MessagePanel.this.getModelObject().getMessage(); //or something similar
  }
}
newmodel(){
@凌驾
公共消息getObject(){
return MessagePanel.this.getModelObject().getMessage();//或类似的内容
}
}
(注意:上面的代码不一定是最好的解决方案,但它是一个演示如何动态使用模型的有效解决方案。)


理想情况下,单击链接时不应替换模型,只需更改模型对象即可。如果您需要自定义模型类(
JPAEntityModel
),那么无论如何,您不应该在面板构造函数中接受预先构造的模型,而应该只接受第一个消息对象。原因是当前的实现没有从一开始就强制使用
JPAEntityModel
,只是在第一次单击链接之后。

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

该行获取面板模型对象的值,即在构造过程中设置的值,并使用该值创建构件模型

add(new Label("messageText", new PropertyModel<Message>(getModelObject(), Message.BODY_FIELD)));
add(新标签(“messageText”,新属性模型(getModelObject(),Message.BODY_字段));
更糟糕的是,当您单击该链接时,面板将显示一个新模型:

MessagePanel.this.setDefaultModel(new JPAEntityModel<Message>(nextMessage));
MessagePanel.this.setDefaultModel(新的JPAEntityModel(nextMessage));
但这显然不会影响标签的模型,因为它已经设置为引用原始值

因此,有两件事你需要改变才能让它发挥作用。首先,标签模型应直接使用面板模型:

new Model<Message>() {
  @Override
  public Message getObject() {
    return MessagePanel.this.getModelObject().getMessage(); //or something similar
  }
}
newmodel(){
@凌驾
公共消息getObject(){
return MessagePanel.this.getModelObject().getMessage();//或类似的内容
}
}
(注意:上面的代码不一定是最好的解决方案,但它是一个演示如何动态使用模型的有效解决方案。)


理想情况下,单击链接时不应替换模型,只需更改模型对象即可。如果您需要自定义模型类(
JPAEntityModel
),那么无论如何,您不应该在面板构造函数中接受预先构造的模型,而应该只接受第一个消息对象。原因是当前的实现没有从一开始就强制使用
JPAEntityModel
,只有在第一次单击链接之后。

您必须在
MessagePanel
中使用call
setOutputMarkupId(true)
。面板需要有标记标识符才能在浏览器中更新标记DOM

您必须在
MessagePanel
中使用call
setOutputMarkupId(true)
。面板需要有标记标识符才能在浏览器中更新标记DOM

这不会改变任何事情。我在示例中添加了更多的内容,也许这会让我们看到更多的信息,但最终不会改变任何事情。我在示例中添加了更多的内容,也许这会让我们看到更多的信息。哦,忘了添加了。我有,哦,忘了加上了。我有。那么,如何从新模型对象中提取数据来刷新标签呢?请改用新的PropertyModel(getModel(),…)。@Martijn Dashorst这确实是一个理想的解决方案,但前提是链接也被修改,以避免调用
setDefaultModel()
。那么,如何让标签刷新,从新模型对象中提取数据?请改用新的PropertyModel(getModel(),…)。@Martijn Dashorst这确实是理想的解决方案,但前提是修改链接以避免调用
setDefaultModel()