0

我正在尝试在 GWT 应用程序中使用 Editor,所以我已经阅读了官方文档。我还查看了here question enter link description here及其答案,但我仍然无法弄清楚编辑的最终“目的”。举个例子,假设一个 UiBinder 有一些字段:

@UiField
TextBox name;

@UiField
TextArea comment;

@UiField
ListBox type;

...

我另外创建了一个方法editCustomer:

private void editCustomer(CustomerProxy entity) {

MyRequestFactory requestFactory = MyRequest.getRequestFactory();

CustomerRequestContext requestContext = requestFactory.customerRequest();

entity = requestContext.edit(entity);

editorDriver.edit(entity, requestContext);
}

我认为使用编辑器的方法可以将 UiBinder 字段与数据库连接起来。这是如何完成的,基于通过“保存”按钮在数据库中发送数据的常见方式?

@UiHandler("saveButton")
void onSaveButtonClick(ClickEvent event){
????
}
4

1 回答 1

0

我使用 MVP 模式已经有一段时间了,并且有一些更复杂的编辑器。我发现将 EditorDriver 放在您的视图中很好,因为当您初始化它时,您可以将它绑定到您的特定视图。我的示例需要一个活动/视图接口/视图实现。

这是一个可以被其他活动扩展的抽象活动,但我包含了相关内容。我已经删除了相当多的代码,但这应该让您了解使用编辑器的有用方法。我的编辑器很复杂,有很多子编辑器。我只包括名称和描述。我们发现这是处理编辑器的一种非常有用的设计模式。

public abstract class AbstractTaskBuilderActivity extends <E extends AnalyticsTaskProxy, R extends DaoRequest<E>> implements TaskBuilderView {


/**
 * Create a new task. This will initialize any new lists.
 * @param context The RequestContext to use to create the task.
 * @param clazz The class type to be created. 
 * @return
 */
protected E create(R context, Class<E> clazz) {
            // This is implemented in my inherited classes.
    E editableAnalyticsTask = context.create(clazz);
            // More initialization code expecially initializing arrays to empty so that 
            // any ListEditor sub editors will work.


    return editableAnalyticsTask;
}

/**
 * Call to edit the task and update the dashboards. 
 * @param context
 * @param task
 */
protected void doEdit(R context, E task) {
    RequestFactoryEditorDriver<? super AnalyticsTaskProxy, ?> driver = display.getEditorDriver();
    E editable = context.edit(task);
    context.save(editable).with(driver.getPaths()).to(new Receiver<Long>() {

        @Override
        public void onFailure(ServerFailure error) {
            display.showError(error.getMessage());
            super.onFailure(error);
        }

        public void onConstraintViolation(Set<ConstraintViolation<?>> violations) {
            display.getEditorDriver().setConstraintViolations(violations);
        }

        @Override
        public void onSuccess(Long response) {
            clientFactory.getPlaceController().goTo(getSavePlace());
        }

    });
    driver.edit(editable, context);
}


    /**
     * Save the task.
     */
        @Override
    public void onSaveTask() {

        RequestFactoryEditorDriver<? super AnalyticsTaskProxy, ?> driver = display.getEditorDriver();

        RequestContext request = driver.flush();
        request.fire();
    }

}

我的视图界面

public interface TaskBuilderView extends View {

    public interface Presenter {
        void onSaveTask();
    }

    public RequestFactoryEditorDriver<AnalyticsTaskProxy, ?> getFactoryEditorDriver();

    public void setPresenter(Presenter presenter);
}

我的观点实现

public class AnalyticsTaskBuilderViewImpl extends ViewImpl implements AnalyticsTaskBuilderView, Editor<AnalyticsTaskProxy> {

    interface AnalyticsTaskBuilderDriver extends RequestFactoryEditorDriver<AnalyticsTaskProxy, AnalyticsTaskBuilderViewImpl> {
    }

    /**
     * UiBinder implementation.
     * 
     * @author chinshaw
     * 
     */
    @UiTemplate("AnalyticsTaskBuilderView.ui.xml")
    interface Binder extends UiBinder<Widget, AnalyticsTaskBuilderViewImpl> {
    }

    /**
     * Name component for the name of the analytics operation.
     * This also implements {@link HasEditorErrors so it can show 
     * constraint violations when an error occurs.
     */
    @UiField
    ValueBoxEditorDecorator<String> name;

    /**
     * Description component that edits analytics operation description.
     * This also implements {@link HasEditorErrors} so it can show
     * constraint violations when an error occurs
     */
    @UiField
    ValueBoxEditorDecorator<String> description;

    public AnalyticsTaskBuilderViewImpl(Resources resources) {
        super(resources);
        // Must initialize the view before calling driver initialize 
        initWidget(GWT.<Binder> create(Binder.class).createAndBindUi(this));
        driver.initialize(this);
    }

    @Override
    public void setPresenter(Presenter presenter) {
        this.presenter = presenter;
        bindToPresenter();
    }

    // Save the task
    @UiHandler("saveTask")
    void handleClick(ClickEvent clickEvent) {
        presenter.onSaveTask();
    }

    @Override
    public RequestFactoryEditorDriver<AnalyticsTaskProxy, ?> getEditorDriver() {
        return driver;
    }
}
于 2012-09-12T16:04:54.413 回答