問題: フォームのロード時に、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);
}
}
}
}