Редактор не получает изменения ListBox - PullRequest
1 голос
/ 11 декабря 2011

Проблема: при загрузке формы, ParentEditor, подчиненный редактор, ThisEditor, правильно заполняет все его поля, включая виджет со списком (выпадающий список), MyWidget. Однако, если я выберу новую опцию в списке и сохраню, она не сохранит вновь выбранную опцию; хотя правки других виджетов сохраняются нормально. Похоже, что при сбросе драйвера редактор не получает значение в моем listBox. В режиме отладки в файле driver.edit я вижу вызов setValue (значение) TakesValueEditor для всех виджетов формы, включая список. Но во флэш-памяти я вижу, как 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);
       }
   }
    }
}

1 Ответ

1 голос
/ 14 января 2012

Я только что столкнулся с этой же проблемой.Если вы посмотрите на исходный код для GWT ListBox, вы увидите, что он не реализует isEditor.Я на самом деле не думаю, что это компонент редактора GWT.Трудно понять.Я должен был обойти это.

...