我正在编写一个简单的解决方案,用于在GWT中上传文件,最近遇到了一个很小但很烦人的问题。我在FormPanel中使用标准的GWT FileUpload小部件。只有当用户点击“物理”一个与表单相关的按钮时,一切正常(表单被提交并且文件被发送到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
机制发送到服务器。它有意义吗?
修改:
根据@ 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);
不幸的是 - 它仍然不起作用。我对发生的事情感到很困惑。
编辑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();
}
}
}
答案 0 :(得分:0)
请勿尝试模拟点击或手动发出请求。你必须以某种方式达到form.submit()。如果窗口小部件层次结构过于复杂而无法使用简单的调用链方法,则应使用事件(请参阅http://www.gwtproject.org/doc/latest/DevGuideUiHandlers.html)。