1

問題: フォームのロード時に、ParentEditor、サブエディター、ThisEditor が、リストボックス (ドロップダウン) ウィジェット、MyWidget を含むすべてのフィールドに適切にデータを入力します。ただし、リストボックスで新しいオプションを選択して保存すると、新しく選択したオプションは保存されません。ただし、他のウィジェットへの編集は問題なく保存されています。ドライバーのフラッシュ時に、エディターが listBox の値を取得しないようです。デバッグ モードでは、driver.edit で、リスト ボックスを含むすべてのフォーム ウィジェットで TakesValueEditor 呼び出し setValue(value) を確認できます。しかし、フラッシュすると、TakesValueEditor が他のフォーム ウィジェットで getValue() を呼び出しているのがわかりますが、リスト ボックスでは呼び出していません。

エディター階層: ParentEditor > ThisEditor > MyWidget。ParentEditor はフォーム全体です。ThisEditor は、フォームのサブセクションです。MyWidget は、ThisEditor セクションのカスタム リストボックスです。

MVP パターンを使用しています。以下は、View と Presenter のサンプル コード スニペットです。

VIEW:

    /** ThisEditor is a sub-section of ParentEditor (the Form) and contains a 
    MyWidget (custom listbox). */
    public class ThisEditor extends Composite implements Editor<ThisProxy>, ThisView {
   ... //rfeDriver interface defined and created here

   @UiField
        MyWidget my;  //getMy and setMy methods in ThisProxy

   ... //other field declarations

        public ThisEditor() {
            initWidget(binder.createAndBindUi(this));
        }

  @Override
       public MyView getMy() {
           return my;
       }
  ... //other methods
    }

    /** This is the View interface that MyWidget implements */
    public interface MyView extends HasOptions, HasValue<MyProxy>, Focusable {
        interface Presenter {
       ...
   }
   ...
    }

    public class MyWidget extends Composite implements MyView,    
            IsEditor<LeafValueEditor<MyProxy>> {
   ...
   @UiField
        ListBox listBox; //single-select dropdown 
   ...

   public MyWidget() {
            initWidget(binder.createAndBindUi(this));
       addChangeHandler(); //listen to changes to listBox and setSelectedIndex (?)
   }
   ...
   @Override
   public int getSelectedIndex() {
            return listBox.getSelectedIndex();
        }

        @Override
        public void setSelectedIndex(int index) {
            listBox.setSelectedIndex(index);
        }
   ...

        /**
         * Called by the TakesValueEditor on rfeDriver.edit.
         */
   @Override
        public MyProxy getValue() {
            //ask presenter for the MyProxy object -- presenter calls
            //getSelectedIndex() on this widget and returns the object associated 
            //with the index 
            return presenter.getValue();
        }

    /**
     * Called by the TakesValueEditor on rfeDriver.flush.
     */
     @Override
     public void setValue(MyProxy value) {
     //pass the value to the presenter to parse and set the index that corresponds  
     //to this object
         presenter.setValue(value);
     }

PRESENTER

    public class MyPresenter implements MyView.Presenter,     
            ValueLookupCompleteEventHandler {
        ...
   protected HasOptions view;
   private List<MyProxy> myList;

   public MyPresenter(ParentPresenter parent) {
       //setParent for this child presenter
   }

   ... //methods to set view and create association between view and presenter

   @Override
   public MyProxy getValue() {
       //identify the current selection
       String selectedId = view.getValue(view.getSelectedIndex());

       if (selectedId != null) {
           //iterate myList to find the MyProxy object whose id.equals(selectedId)
           for (Iterator<MyProxy> i = myList.iterator(); i.hasNext();) {
          MyProxy value = i.next();
          if (selectedId.equals(value.getCode().toString())) {
              return value;
          }
      } 
            }
       return null;
        }

   @Override
   public void setValue(MyProxy value) {
       //handle null value
        String selectedId = value.getCode().toString();
   ... //verify the value is in myList

   //traverse dropdown list and set selected index corresponding to value object
   for (int i = 0; i < view.getItemCount(); ++i) {
       if (selectedId.equals(view.getValue(i))) {
           view.setSelectedIndex(i);
       }
   }
    }
}
4

1 に答える 1

1

この同じ問題に遭遇しました。GWT ListBox のソース コードを見ると、isEditor が実装されていないことがわかります。実際、それが GWT エディター コンポーネントだとは思いません。わかりにくい。その周りをコーディングする必要がありました。

于 2012-01-14T14:15:13.947 に答える