我遇到了以下问题: 如果模型发生变化,我的自制视频类(扩展面板)不会更新。
这是目前的状态: 我得到了一个带有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);
}
}
我一直在互联网上搜索几个小时,却没有找到任何帮助。 希望你们能给我一些解决这个问题的方法。谢谢你。 问候
答案 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
MarkupContainer和MultiLineLabel WebComponent之间的差异有关}?
Video
和MultiLineLabel
都会在其构造函数中添加到ExerciseDescriptionPanel
。如果我正确理解Wicket documentation,只要周围的Page
和ExerciseDescriptionPanel
保持相同的实例,就不会重新生成Video
的标记。它说:
页面通过呈现其关联的标记(位于页面旁边的html文件)来呈现自身。由于MarkupContainer(Page的超类)遍历关联标记的标记流,它会通过id查找标记中附加到标记的组件。由于MarkupContainer(在本例中为Page)已经由onBeginRequest()构造和初始化,因此每个标记的子元素应该在容器中可用。一旦检索到Component,就会调用render()方法。
在您更改Video
的模型后,也许您在ExerciseDescriptionPanel
上致电modelChanged(),表明必须刷新标记。