【问题标题】:WICKET: Updating a self-made PanelWICKET:更新自制面板
【发布时间】:2012-12-27 20:23:10
【问题描述】:

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

这是当前状态: 我得到了一个带有 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);
   }
}            

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

【问题讨论】:

    标签: refresh wicket panel


    【解决方案1】:

    您只将练习从模型中拉出一次:

    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)); 
      }
    };   
    

    【讨论】:

    • 我在阅读代码时完全错过了这一点。我认为你是对的,你的答案比我的更合理。
    • 您好,谢谢您的回答。你是对的,我仍然是一个检票口初学者,我真的很怀念这一点。问题是,它仍然无法正常工作。我在 onComponentTag-Method 中放了一个 info("test") 并在页面上放了一个反馈面板,但是在切换我的 listChoice 时它从未打印出来。我还能做错什么?由于 MultiLineLabel 的 Model 得到了更新,Video-Class 的 Model 也必须得到它。所以 Model 发生了变化,但这是否已经意味着 onComponentTag 被执行了?
    • onComponentTag() 为每次渲染调用。当您通过将ExerciseDescriptionPanel 添加到AjaxRequestTarget 来刷新它时,它的所有子组件也将被重新渲染。将 @Override 添加到您的 onComponentTag() 以确保它具有正确的签名。
    • 感谢您的快速回复。我向它添加了@Override,但它没有用。我的页面上显示的视频总是显示剪辑:'[Clip]'Null''。所以我认为它总是在加载页面时使用返回的新练习()。是否有另一种方法可以在 Video-Class 的 WebMarkupContainer 中获取当前模型?在ExerciseDescriptionPanel“ExerciseDescriptionPanel.this.getModel().getObject()”中获取对象的方式是不可能的。我没有任何其他想法......也许改变视频播放,虽然我不相信这会有所帮助。
    • 编辑: 我刚刚发现,我忘了删除 AttributeModifier...这导致了问题。愚蠢,但现在它的工作。非常感谢您的时间。
    【解决方案2】:

    注意:请忽略这个卑微的帮助你的尝试,svenmeier 的回答比我的要好。

    我不能 100% 确定这是否属实,但这是否与您的 VideoMarkupContainerMultiLineLabelWebComponent 之间的区别有关?

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

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

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

    【讨论】:

    • 嘿,还是谢谢你。我也试过了,值得一试:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多