GWT редакторы для чтения и редактирования
Среда редактора GWT действительно удобна и может использоваться не только для редактирования POJO, но также и для отображения только для чтения.
Однако я не совсем уверен, что лучше всего делать встроенные правки.
Давайте предположим, что у меня есть PersonProxy
и у меня есть один Presenter-View
пара для отображения и редактирования PersonProxy
, Этот Presenter-View должен по умолчанию отображать PersonProxy
в режиме только для чтения, и если пользователь нажимает на кнопку редактирования, он должен позволить пользователю редактировать PersonProxy
объект.
Решением, которое я придумал, было создание двух редакторов (PersonEditEditor
а также PersonDisplayEditor
) которые оба добавлены через UiBinder
к View
, PersonEditEditor
содержит ValueBoxEditorDecorator
с и PersonDisplayEditor
содержит нормальный Labels
,
Изначально я отображаю PersonDisplayEditor
и спрятать PersonEditEditor
,
в View
Я создаю два RequestFactoryEditorDriver
для каждого редактора и сделать его доступным из Presenter
через View
интерфейс. Я также определяю setState()
метод в View
интерфейс.
Когда Presenter
отображается в первый раз, когда я звоню PersonDisplayDriver.display()
а также setState(DISPLAYING)
,
Когда пользователь нажимает кнопку " Изменить", я звоню PersonEditDriver.edit()
а также setState(EDITING)
от моего Presenter
,setState(EDITING)
скроет PersonDisplayEditor
и сделать PersonEditEditor
видимый.
Я не уверен, что это лучший подход. Если нет, каков рекомендуемый подход для выполнения встроенных правок? Какой лучший способ провести юнит-тестирование в редакторах?
2 ответа
Если вы можете позволить себе разработку двух разных представлений, то пользуйтесь этим, это дает вам максимальную гибкость.
То, что мы делали в нашем приложении, где мы не могли позволить себе затраты на разработку и поддержание двух представлений, заключалось в том, чтобы внедрить два состояния в наши редакторы, например, в пользовательский компонент, который может быть либо меткой, либо текстовым полем (в большинстве В некоторых случаях мы просто устанавливаем текстовое поле только для чтения и применяем некоторые стили, чтобы скрыть границы блока).
Чтобы определить, в каком режиме мы находимся, потому что мы используем RequestFactoryEditorDriver
(как и вы), у нас есть наши редакторы HasRequestContext
: получение null
значение здесь означает, что водитель display()
метод был использован, поэтому мы находимся в режиме только для чтения. Альтернативой было бы использовать EditorVisitor
наряду с некоторыми HasReadOnly
интерфейс (который, кстати, именно то, что RequestFactoryEditorDriver
делает, чтобы передать RequestContext
до HasRequestContext
редактора).
Да, пара Presenter-View должна быть. Но вот два способа достижения этой функции, если вам нравится идти с:
1) Объединить дизайн редактирования / просмотра кода в один код ui.xml ieEdit в EDitHorizonatlPanel и просмотреть код в ViewHorizontPanel. Панель имеет другой идентификатор. Используя id, показать / скрыть панель с методом отображения. если getView().setState() ==Displaying
затем показать ViewHorizontPanel, и если getView().setState()==Editing
затем покажите EditHorizontPanel.
2) Вместо использования надписей, используйте только текстовые поля. установите свойство Enable равным false, если оно необходимо в режиме просмотра, в противном случае - true
Вы создали два Presenter/view, но я думаю, что если функция Edit/View имеет похожий код, то нет необходимости переписывать один и тот же код снова и снова для целей просмотра.
Если в большом проекте так много функций редактирования / просмотра, и вы создадите такой тип нескольких представлений / презентаций, размер вашего проекта станет таким ненужным.
Я думаю, что все, что я предлагаю, может быть не очень хорошим подходом, но нужно найти способ, который поможет избежать репликации кода.