2010-12-16 11 views
0

私はユーザーの言語を選択するためのコンボボックス/ドロップダウンのフォームを持っています。ユーザーが言語を変更した場合は、すべてのラベルを更新したいが、入力要素はそのままにしておきたい。Wicket:既存の入力を失うことなく現在のフォームを再レンダリングするにはどうすればよいですか?

jQueryのでは、私は、ラベルIDとJSONを介した新しいテキストのリストを要求してから、このようなループを使用したい:

var texts = {[ {id:'nameLabel', text:'First Name'}, {id:'familyLabel', text:'Family Name'} ]}; 
for(var i=0; i<texts.length; i++) { 
    var item = texts[i]; 
    $('#'+item.id).text(item.text); 
} 

他に何も変更せずに、すべてのラベルを更新します。どのように私はWicketでこれを行うのですか?

私が試した何[EDIT]:

 DropDownChoice<Locale> ddc = new DropDownChoice<Locale>(...); 
     ddc.add(new AjaxFormComponentUpdatingBehavior("onchange") { 
      private static final long serialVersionUID = 1L; 

      @Override 
      protected void onUpdate(AjaxRequestTarget target) { 
       getSession().setLocale(language); 
       for(MarkupContainer label : labels) { 
        target.addComponent(label); 
       } 
      } 
     }); 

これは、ラベルを変更したが、それはまた再びすべての入力フィールドをレンダリングします。入力フィールドの現在の値にアクセスする方法が見つかりませんでした。

[EDIT2]ラベルのリストは、それほどのように作成されます。

 StringResourceModel usernameLabel = new StringResourceModel("usernameLabel", this, new Model<ValueMap>(map)); 
     labels.add(add(new Label("usernameLabel", usernameLabel))); 
+0

: '(MarkupContainerラベル:ラベル)のために'何のラベルで、どのようにそれを得るのですか? –

+0

ラベルは、ページ上のすべてのラベルのリストです。コードについてはEDIT2を参照してください。 –

答えて

1

これは間違っている:それは繰り返し加えることだ

labels.add(add(new Label("usernameLabel", usernameLabel))); 

あなたは「ラベル」にラベルのインスタンスを追加していません、コンテナ(おそらくPageインスタンス)に追加します。メソッド 'add()'は追加されるコンポーネントを返しません。コンポーネントを追加するコンテナを返します。

にそれを変更してみてください:

この行で
Label label = new Label("usernameLabel", usernameLabel); 
add(label); 
labels.add(label); 
+0

あなたはそうです。私も 'label.setOutputMarkupId(true);'を呼び出す必要がありましたが、今は完全に動作します! –

関連する問題