2016-01-28 8 views
1

У меня есть следующие модели:Создать модель с содержанием CellList с использованием редактора GWT Editor Framework?

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

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

Я хочу создать GWT виджет, где я могу создать автор и создать как можно больше книг, как это возможно при создании автора в ту же точку зрения. Вот как это может выглядеть следующим образом:

enter image description here

Вы можете добавить столько книг, сколько вы хотите:

enter image description here

Я хочу использовать рамки 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 таким образом, чтобы я мог добавлять книги к автору, и что мне нужно сделать с редактором, чтобы получить созданный список Book s, сбрасываемый в модель автора?

ответ

1

Здесь вы можете достичь этого. Вам нужно создать редактор, 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, просто создать новый виджет, который реализует Editor<Book> и создать в соответствии UiFields, чтобы иметь возможность редактировать объект книги. Значения будут обрабатываться родительским автором SimpleBeanDriver. Затем в MyWidgetView, просто добавьте UiField:

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

Если вы хотите добавить/удалить виджеты на лету и синхронизировать его с ListEditor, просто работать с классом BooksEditor. editor.getList().add(new Book()) автоматически добавит новый BookEditor в вашу панель. Вызов editor.getList().remove(bookToRemove) удалит его (см. Метод dispose() в BookEditorSource, он вызывается при вызове remove в списке).

+0

В чем разница между BookEditor и BooksEditor - это орфографическая ошибка? – confile

+0

Список должен быть представлен CellList. Не могли бы вы обновить свой ответ, чтобы он работал. – confile

+0

Что касается различий между BooksEditor и BookEditor, BooksEditor редактирует список книг, а BookEditor редактирует одну книгу. – meriouma