0

私は次の問題を抱えています:モデルが変更された場合、自作のビデオクラス(パネルを拡張)が更新されません。

これが現在の状態です。ListChoice を持つクラス "A" を取得しました。このクラスは、ListChoice の現在選択されているアイテムを含むモデルを取得するパネル「descrPanel」を作成します。ユーザーが 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 (拡張 Panel) を挿入しました。また、MultiLineLabel を挿入しました:

クラス演習DescriptionPanel

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はそれを無視して「新しいExercise()」を返し続けることです.選択が行われていない場合の ListChoice。

Video-Class も提供します。

クラスビデオ

  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

モデルから演習を 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)); 
  }
};   
于 2012-12-28T10:11:27.333 に答える
0

:あなたを助けるためのこの謙虚な試みを無視してください.svenmeierの答えは私のものよりもはるかに優れています.

Videoこれが本当かどうかは 100% わかりませんが、あなたがMarkupContainerであることとMultiLineLabelWebComponentであることの違いに関連している可能性がありますか?

Videoと の両方が、そのコンストラクターで にMultiLineLabel追加されます。Wicket のドキュメントExerciseDescriptionPanelを正しく理解していれば、周囲が同じインスタンスのままである限り、のマークアップは再生成されません。それは言います:PageExerciseDescriptionPanelVideo

ページは、関連付けられたマークアップ (ページの隣にある html ファイル) をレンダリングすることによって、それ自体をレンダリングします。MarkupContainer (Page のスーパークラス) は、関連付けられたマークアップのマークアップ ストリームを反復処理するときに、マークアップ内のタグに関連付けられたコンポーネントを ID で検索します。MarkupContainer (この場合は Page) は onBeginRequest() によって既に構築および初期化されているため、各タグの子はコンテナーで使用できるはずです。コンポーネントが取得されると、render() メソッドが呼び出されます。

おそらく、モデルを変更した後にmodelChanged()を呼び出すと、マークアップを更新する必要があることを示している可能性があります。VideoExerciseDescriptionPanel

于 2012-12-27T22:48:51.953 に答える