0

我遇到了以下问题:如果模型更改,我的自制视频课程(扩展面板)不会更新。

这就是当前状态:我得到了一个带有 ListChoice 的“A”类。此类创建面板“descrPanel”,该面板获取一个模型,其中包含 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:

课堂练习描述面板

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 的当前选择更新的,但视频类只是忽略它并不断返回“新练习()”,这应该只在第一次加载时返回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);
   }
}            

我已经在互联网上搜索了几个小时,但没有找到任何有用的东西。希望你们能给我一些解决这个问题的方法。对此表示感谢。问候

4

2 回答 2

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)); 
  }
};   
于 2012-12-28T10:11:27.333 回答
0

注意:请忽略这种谦虚的尝试来帮助您,svenmeier 的回答比我的要好得多。

我不是 100% 确定这是否属实,但这是否与您Video作为MarkupContainerMultiLineLabel作为WebComponent之间的区别有关?

theVideo和 theMultiLineLabel都被添加到ExerciseDescriptionPanel其构造函数中的 the 中。如果我正确理解了Wicket 文档,只要周围Page并因此ExerciseDescriptionPanel保持相同的实例,Video就不会重新生成标记。它说:

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

也许您在更改模型后调用modelChanged()可能表明必须刷新标记。VideoExerciseDescriptionPanel

于 2012-12-27T22:48:51.953 回答