2017-07-25 16 views
0

ClassChoiceコントロールはCheckBoxMultipleChoiceを継承します。これは、複数のページで使用される一般的なコントロールであり、セッションで選択されたものが保持されます。使用可能な選択肢は、データベースから取得されます。複数のデータ項目がある場合は、「すべて」チェックボックスが追加されます。一部のページでは、選択の変更によってページが新しいデータでリフレッシュされます。他のページでは、選択内容はリフレッシュせずに変更する必要があります。CheckBoxMultipleChoiceのモデルを更新するにはどうすればよいですか?

私の問題は、他のチェックボックスが変更されたときに「すべて」チェックボックスを制御し、「すべて」チェックボックスが変更されたときにすべてのチェックボックスを変更する必要があるということです。

変更を強制するためにupdateModel()に電話をかけようとしましたが、うまくいきませんでした。ページを更新せずに選択内容(modelパラメータ)を変更するにはどうすればよいですか?

この編集されたコードでは、ページを更新していません。

public class ClassChoice<T> extends CheckBoxMultipleChoice 
{ 
    private static final long serialVersionUID = 1L; 

    @SpringBean 
    private ClassService classService; 

    List<EntityClassModel> selection; 
    EntityClassModel ecmAll; 

    static List<EntityClassModel> availableClasses; 

    public ClassChoice(..) 
    { 
     super("classcheckboxes"); 

     setSuffix(" "); // sets checkbox separator and ensures inline display 

     ecmAll = (EntityClassModel) modelFactory.getNewClassModel(); 
     ecmAll.setClassname("All"); 

     // List of all classes associated with user 
     availableClasses = classService.getListOfClasses(..); 
     setClassChoices(); 

     add(new AjaxFormChoiceComponentUpdatingBehavior() 
     { 
      private static final long serialVersionUID = 1L; 

      @Override 
      protected void onUpdate(AjaxRequestTarget target) 
      { 
       List<Integer> previousIDs = UserSession.get().getSelectedClassIDs(); 
       if ((previousIDs.size() > 0) && ((previousIDs.size() + 1) >= availableClasses.size())) 
       { 
        // Was previously Select All 
        if (selection.get(selection.size() - 1) == ecmAll) 
        { 
         // Select All still selected, remove it 
         selection.remove(selection.size() - 1); 
        } 
        else 
        { 
         // Remove all selections 
         selection.clear(); 
        } 
       } 
       else if (selection.size() > 0) 
       { 
        // Was none or some selected 
        if (selection.get(selection.size() - 1) == ecmAll) 
        { 
         // Select All, select all available 
         selection.clear(); 
         selection.addAll(availableClasses); 
        } 
        else if ((selection.size() + 1) >= availableClasses.size()) 
        { 
         // Is now full, add Select All 
         selection.add(ecmAll); 
        } 
        // else change but no special handling required 
       } 
       // else none are currently selected 

       UserSession.get().setSelectedClasses(selection); 

       // Generate a list of selected class IDs, excluding All 
       List<Integer> selectedIDs = new ArrayList<Integer>(); 
       int copysize = selection.size(); 
       if ((copysize > 0) && (selection.get(copysize - 1) == ecmAll)) 
       { 
        copysize--; 
       } 
       for (int index = 0; index < copysize; index++) 
       { 
        selectedIDs.add(selection.get(index).getId()); 
       } 
       UserSession.get().setSelectedClassIDs(selectedIDs); 

       // Update the selections on the page 
       updateModel(); 
      }     
     }); 
     Initialize(); 
    } 

    @SuppressWarnings("unchecked") 
    protected void Initialize() 
    { 
     // Grabs already selected classes from UserSession 
     List<Integer> selectedIDs = UserSession.get().getSelectedClassIDs(); 
     selection = classService.getClassesByClassIDs(selectedIDs); 
     if (selectedIDs.size() > 1) 
     { 
      if ((selectedIDs.size() + 1) >= availableClasses.size()) 
      { 
       selection.add(ecmAll); 
      } 
     } 
     setModel(Model.ofList(selection)); 

     // Configure the data and display 
     setChoiceRenderer(new ChoiceRenderer<EntityClassModel>("classname", "id")); 
     setOutputMarkupId(true); 
    } 

    @SuppressWarnings("unchecked") 
    public void setClassChoices() 
    { 
     // Adds 'All' option when there is more than one class 
     if (availableClasses.size() > 1) 
     { 
      availableClasses.add(ecmAll); 
     } 
     setChoices(availableClasses); 

    } 

    public List<EntityClassModel> getSelection() 
    { 
     return selection; 
    } 
} 

答えて

2

ブラウザ側でHTML要素を更新するには、AjaxRequestTargetを使用する必要があります。 selectionに要素を追加/削除すると、サーバー側でClassChoiceのモデルが変更されます。 AjaxFormChoiceComponentUpdatingBehavior#onUpdate()の下部で、target.add(this)を実行して、この選択/モデルでこのClassChoiceインスタンスを再描画するようにWicketに指示する必要があります。

コンストラクタでをコールすることを忘れないでください。そうしないと、Ajaxでアップデートできません。

関連する問題