我有一个使用GXT的应用程序,包含±30个表单。我想制作这些表单,以便当用户点击输入文本字段时,表单会被提交,就像普通的浏览器表单一样。
我知道我可以为每个文本字段添加一个按键监听器,按下输入后会调用提交,但由于我想将它应用于每种形式的每个字段,我不确定这是否理想。
有没有更简单的方法在整个应用程序中实现它?
如果没有,我应该使用哪种模式将此功能添加到每个字段?我可以扩展TextField类,在子类中添加功能并在应用程序中使用子类。或者我可以为文本字段类创建一个工厂,它也会将监听器添加到字段中。还是有其他方式,也许装饰师?我想知道这些方法中哪一个(如果有的话)通常是首选。
答案 0 :(得分:1)
我会尝试这样的事情:
Event.addNativePreviewHandler(new NativePreviewHandler() {
@Override
public void onPreviewNativeEvent(NativePreviewEvent event) {
if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
if (event.getNativeEvent().getEventTarget() != null) {
Element as = Element.as(event.getNativeEvent().getEventTarget());
if (as.getTagName().toLowerCase().equals("input") ||
as.getTagName().toLowerCase().equals("textarea")) {
// TODO submit data;
}
}
}
}
});
每当有人点击Enter键并且光标放在input-或textarea-tag上时,您将获得控件并可以提交您的数据。
答案 1 :(得分:0)
我不认为有办法直接在GXT库中提出要求。我想强调的是,扩展TextField类只是为了向它添加事件处理程序不是处理它的正确方法。事件处理程序基于类的组成。这就像扩展一个带有List字段的类只是为了在列表中添加另一个元素。
在我看来,为您创建并初始化Textfield的单件工厂类将是最干净的解决方案。如果需求发生变化,它将允许您在以后的某个地方有效地更改默认值并添加其他处理程序。
答案 2 :(得分:0)
您也可以使用GWT JSNI
进行尝试。
要遵循的步骤:
JavaScript
中按Enter
按键GWT JSNI
onModuleLoad
时导出的JavaScript函数调用GWT JSNI
示例代码:
HTML / JSP:
<script>
window.onkeydown = keydown;
function keydown(event) {
if (event.which == 13) {
formSubmit(event.target);
}
}
</script>
JAVA(入口点):
import com.google.gwt.dom.client.Element;
public void onModuleLoad() {
exportFormSubmit();
...
}
public static void formSubmit(Element element) {
Window.alert("element tag name:" + element.getTagName() + "form ID:"
+ element.getParentElement().getId());
}
public static native void exportFormSubmit() /*-{
$wnd.formSubmit = $entry(@com.x.y.z.client.GWTTestProject::formSubmit(Lcom/google/gwt/dom/client/Element;));
}-*/;