1

我有以下模型:

class Book {
  String title;
  // getter and setter
}

class Author {
  private name;
  private List<Book> books;
  // getter and setter  
}

我想创建一个 GWT 小部件,我可以在其中创建作者并创建尽可能多的书籍,同时在同一视图中创建作者。以下是它的样子:

在此处输入图像描述

您可以根据需要添加任意数量的书籍:

在此处输入图像描述

我想使用 GWT Editor 框架来填充视图和模型之间的数据。这是我只对Author没有列表的模型执行此操作的方法。

我的 UiBinder:

<g:TextBox ui:field="nameInput"/>

我的 Widget.java:

public class MyWidgetView {

  @Path(value="name")
  @UiField
  TextBox nameInput;

public interface EditorDriver extends SimpleBeanEditorDriver<Author, MyWidgetView> { }

  @Override
  public SimpleBeanEditorDriver<Author, ?> createEditorDriver() {
    EditorDriver driver = GWT.create(EditorDriver.class);
    driver.initialize(this);
    return driver;
  }

}

在我的演示者中,我创建了:

SimpleBeanEditorDriver<TriggerDto, ?> editorDriver = getView().createEditorDriver();

这适用于简单模型,但我想将其用于上述作者模型,其中包含List<Book>.

如何设置 UiBinder 以便我可以将 Books 添加到作者,以及我与编辑器有什么关系才能将创建的Books 列表刷新到作者模型中?

4

1 回答 1

1

在这里,您如何实现这一目标。您需要创建一个 Editor、一个 ListEditor 和一个 EditorSource

public class BooksEditor implements IsWidget, IsEditor<ListEditor<Book, BookEditor>> {
    private final HTMLPanel main;
    private final ListEditor<Book, BookEditor>> editor;

    @Inject
    BooksEditor(
            Provider<BookEditor> bookEditorProvider) {
        main = new HTMLPanel("");
        editor = ListEditor.of(new BookEditorSource(bookEditorProvider, main));
    }

    @Override
    public ListEditor<Book, BookEditor> asEditor() {
        return editor;
    }

    @Override
    public Widget asWidget() {
        return main;
    }`
}

public class BookEditorSource extends EditorSource<BookEditor> {
    private final Provider<BookEditor> bookEditorProvider;
    private final HTMLPanel books;

    public BookEditorSource(
            Provider<BookEditor> bookEditorProvider,
            HTMLPanel books) {
        this.bookEditorProvider = bookEditorProvider;
        this.books = books;
    }

    @Override
    public BookEditor create(int index) {
        BookEditor bookEditor = bookEditorProvider.get();
        books.add(bookEditor);

        return bookEditor;
    }

    @Override
    public void dispose(BookEditor subEditor) {
        super.dispose(subEditor);

        books.remove(subEditor);
    }
}

要创建 BookEditor 类,只需创建一个新的 Widget 来实现Editor<Book>并创建相应的 UiFields 以便能够编辑您的 Book 对象。这些值将由父 Author SimpleBeanDriver 处理。然后在您的 中MyWidgetView,只需添加一个 UiField :

@UiField(provided = true)
@Path("books")
BooksEditor booksInput;

如果您想动态添加/删除小部件并将其与 ListEditor 同步,只需使用 BooksEditor 类。editor.getList().add(new Book())将自动在您的面板中添加一个新的 BookEditor。调用editor.getList().remove(bookToRemove)将删除它(参见 BookEditorSource 中的 dispose() 方法,它在调用列表上的 remove 时调用)。

于 2016-02-03T01:44:05.580 回答