WICKET:更新自制面板

时间:2012-12-27 20:23:11

标签: refresh wicket panel

我遇到了以下问题: 如果模型发生变化,我的自制视频类(扩展面板)不会更新。

这是目前的状态: 我得到了一个带有ListChoice的“A”类。此类创建Panel“descrPanel”,它获取一个Model,其中包含ListChoice的当前所选项。当用户在ListChoice中选择一些内容时,它会被更新(ListChoice得到一个AjaxBehaviour,通过target.add(descrPanel)更新descrPanel):

A类:

    PropertyModel<Exercise> currExerciseModel = new PropertyModel<Exercise>(this,"selectedExercise");
    final ExerciseDescriptionPanel descrPanel = new ExerciseDescriptionPanel("descrPanelTag", currExerciseModel);

    descrPanel.setOutputMarkupId(true);

在Class ExerciseDescriptionPanel中,我插入了我自制的Video-Class(扩展面板)。我还插入了MultiLineLabel:

类ExerciseDescriptionPanel

public class ExerciseDescriptionPanel extends Panel {

private IModel<Exercise> model;
private Exercise exercise;

public ExerciseDescriptionPanel(String id, IModel<Exercise> model) {
    super(id, model);
    this.model = model;

MultiLineLabel mll = new MultiLineLabel("mll", new Model() { 
        @Override 
        public String getObject() {  
            if (ExerciseDescriptionPanel.this.getModel().getObject() != null){
                return ExerciseDescriptionPanel.this.getModel().getObject().getDescription();
            }
            else return "";
        }
    });
    add(mll);


    Video video = new Video("myVideo", new Model<Exercise>(){
        @Override 
        public Exercise getObject() {  
            if (ExerciseDescriptionPanel.this.getModel().getObject() != null){
                return ExerciseDescriptionPanel.this.getModel().getObject();
            }
            else return new Exercise();
        }

    });
    add(video);
}

嗯,我不明白的是:当描述根据ListChoice的当前选择进行更新时,Video-Class只是忽略它并继续返回“new Exercise()”,这只能返回到当没有选择时,首先加载ListChoice。

我还为您提供了视频类:

课堂视频

  public class Video extends Panel{

private IModel<Exercise> model;

public Video(String id, IModel<Exercise> model) {
    super(id, model);

    String src = ((Exercise)model.getObject()).getVideo();
    String startPicDest = ((Exercise)model.getObject()).getPicture();

WebMarkupContainer flashSrc = new WebMarkupContainer("flashSrcTag");
    flashSrc.add(new AttributeModifier("value", "config={'playlist':['" +
                startPicDest +"',{'url':'"+ src +"','autoPlay':false}]}")); 
    this.add(flashSrc); 

    setOutputMarkupId(true);
   }
}            

我一直在互联网上搜索几个小时,却没有找到任何帮助。 希望你们能给我一些解决这个问题的方法。谢谢你。 问候

2 个答案:

答案 0 :(得分:2)

你只是将模特拉出模特一次:

public Video(String id, IModel<Exercise> model) {
  super(id, model);

  String src = ((Exercise)model.getObject()).getVideo();
  ...
}

当练习稍后改变时,这应该是最新的?

您必须获取每个渲染的实际值:

WebMarkupContainer flashSrc = new WebMarkupContainer("flashSrcTag") {
  public void onComponentTag(ComponentTag tag) {
    Exercise temp = (Exercise)model.getObject();
    String src = temp.getVideo();
    String startPicDest = temp.getPicture();

    tag.put("value", String.format("config={'playlist':['%s',{'url':'%s','autoPlay':false}]}", startPicDest, src)); 
  }
};   

答案 1 :(得分:0)

注意:请忽略这个不起眼的尝试来帮助你,svenmeier的回答比我的好。

如果这是真的,我不是100%确定,但它可能与您Video MarkupContainerMultiLineLabel WebComponent之间的差异有关}?

VideoMultiLineLabel都会在其构造函数中添加到ExerciseDescriptionPanel。如果我正确理解Wicket documentation,只要周围的PageExerciseDescriptionPanel保持相同的实例,就不会重新生成Video的标记。它说:

  

页面通过呈现其关联的标记(位于页面旁边的html文件)来呈现自身。由于MarkupContainer(Page的超类)遍历关联标记的标记流,它会通过id查找标记中附加到标记的组件。由于MarkupContainer(在本例中为Page)已经由onBeginRequest()构造和初始化,因此每个标记的子元素应该在容器中可用。一旦检索到Component,就会调用render()方法。

在您更改Video的模型后,也许您在ExerciseDescriptionPanel上致电modelChanged(),表明必须刷新标记。