首页 文章

以编程方式调用button.click()后,GWT FileUpload form.submit()不起作用

提问于
浏览
1

我'm writing a simple solution for uploading files in GWT and recently encountered a tiny, but quite annoying problem. I'm在FormPanel中使用标准的GWT FileUpload小部件 . 只有当用户单击"physically"与表单相关的按钮时,一切正常工作(表单被提交并且文件被发送到servlet),附带一个单击处理程序(内部有 form.submit() 被触发) .

不幸的是,我必须在FormPanel的父窗口小部件(另一个类)中从另一个地方提交表单 . 我尝试使用此特定代码和Visible属性设置为“false”的按钮实现点击模拟:

public void buttonClick() 
{
    NativeEvent event = Document.get().createClickEvent(0, 0, 0, 0, 0, false, false, false, false);
    DomEvent.fireNativeEvent(event, saveFileBtn);
}

saveFileBtn.addClickHandler(new ClickHandler()
{

    @Override
    public void onClick(ClickEvent event)
    {
        if(fileUpload.getFilename().isEmpty())
            return;
        else {
            form.submit();
        }           
    }
});

在调用 buttonClick() 方法后,会触发click事件,但表单不会提交(只是没有任何反应) . 触发点击事件的这两种方法之间是否有任何差异?

如果是这样,那么最好的替代方法是什么呢?我想让自己的小部件执行与标准GWT FormPanel类似的操作,但是以 base64 格式编码文件并使用 RequestBuilder 机制发送到服务器 . 是否有意义?

EDIT

根据@Pedro Pedruzzi的回答,我已经实施了一个活动:

public interface FormToSubmitEventHandler extends EventHandler {
   void onFormToSubmit(FormToSubmitEvent event);
}

public class FormToSubmitEvent extends GwtEvent<FormToSubmitEventHandler> {

    public static final Type<FormToSubmitEventHandler> TYPE = new Type<FormToSubmitEventHandler>();

    public FormToSubmitEvent() {
        super();
    }

    @Override
    public Type<FormToSubmitEventHandler> getAssociatedType()
    {
        return TYPE;
    }

    @Override
    protected void dispatch(FormToSubmitEventHandler handler)
    {
        handler.onFormToSubmit(this);
    }

    public static HandlerRegistration register(EventBus eventBus, FormToSubmitEventHandler handler) 
    {
        return eventBus.addHandler(TYPE, handler);
    }  
}

在widget类(实现上面的接口)中添加:

@Override
public void onFormToSubmit(FormToSubmitEvent event)
{
    if(fileUpload.getFilename().isEmpty())
        return;
    else {          
        form.submit();
    }   
}

然后:

FormToSubmitEvent event = new FormToSubmitEvent();
Events.getTactinEventBus().fireEvent(event);

不幸的是 - 它仍然无效 . 我对发生的事情感到很困惑 .

EDIT 2

注册处理程序的全班:

public class FileLinkPropertyControl implements FormToSubmitEventHandler
{
    private FileUpload fileUpload;
    protected FormPanel form;;
    protected HorizontalPanel hPanel;   

    public FileLinkPropertyControl() {

    fileUpload = new FileUpload();

    FormToSubmitEvent.register(Events.getTactinEventBus(), this);

    fileUpload.setName("fileUploadFormElement");
    fileUpload.addChangeHandler(new ChangeHandler()
    {

        @Override
        public void onChange(ChangeEvent event)
        {
            setValue(fileUpload.getFilename(), true);                       
        }
    });

    form.setEncoding(FormPanel.ENCODING_MULTIPART);
    form.setMethod(FormPanel.METHOD_POST);
    form.setAction(GWT.getModuleBaseURL() + "fileUploadServlet");
    form.setWidget(hPanel);
    hPanel.add(fileUpload);
    }

    @Override
    public void onFormToSubmit(FormToSubmitEvent event)
    {
        if(fileUpload.getFilename().isEmpty())
            return;
        else {
            form.submit();
        }   
    }
}

1 回答

  • 0

    不要尝试模拟点击或手动发出请求 . 你必须以某种方式达到form.submit() . 如果窗口小部件层次结构太复杂而无法使用简单的调用链方法,则应使用事件(请参阅http://www.gwtproject.org/doc/latest/DevGuideUiHandlers.html) .

相关问题