Javascript 启用和禁用GWT页面上的保存按钮

Javascript 启用和禁用GWT页面上的保存按钮,javascript,events,gwt,textbox,dom-events,Javascript,Events,Gwt,Textbox,Dom Events,我正在使用的应用程序有很多带有文本框的设置数据页面;每个页面都有一个保存按钮。我已经将大多数页面定义为*.ui.xml文件,并使用了GWT2.0UI绑定 我想添加一个保存按钮,该按钮被禁用onload,仅在用户将数据修改到其中一个文本框后才启用 我知道我可以针对页面上的每个元素注册一个事件处理程序来启用按钮,但我想要一个更优雅的解决方案。理想情况下,我想定义一个按钮,用于“侦听”页面上的事件并自行更改。这在GWT中可能吗?查看GWT关于MVP的文章 特别是事件部分和事件总线 再看看这个你可以

我正在使用的应用程序有很多带有文本框的设置数据页面;每个页面都有一个保存按钮。我已经将大多数页面定义为*.ui.xml文件,并使用了GWT2.0UI绑定

我想添加一个保存按钮,该按钮被禁用
onload
,仅在用户将数据修改到其中一个文本框后才启用


我知道我可以针对页面上的每个元素注册一个事件处理程序来启用按钮,但我想要一个更优雅的解决方案。理想情况下,我想定义一个按钮,用于“侦听”页面上的事件并自行更改。这在GWT中可能吗?

查看GWT关于MVP的文章

特别是事件部分和事件总线


再看看这个

你可以找到一个非常简单的解决方案

  • 将所有可编辑控件放入HTMLPanel(或任何其他面板,如果需要)
  • 在附带的java文件中有对该HTMLPanel的ui:field引用
  • 在java类中调用initWidget后不久,迭代HTMLPanel的所有子部件,并在每个输入部件上注册一个ChangeHandler 伪代码:

        for ( int i = 0; i < hTMLPanel.getWidgetCount( ); i++ )
        {
            Widget widget = hTMLPanel.getWidget( i );
    
            if ( widget instanceof HasChangeHandlers )
                ((HasChangeHandlers)widget).addChangeHandler( <Your Change Handler to enable save>);
        }
    
    for(inti=0;i

    如果您有嵌套的小部件,您可以使其递归。

    您还可以使用
    addDomHandler

    public class SetupDataPage extends Composite{
    
      // Binder stuff  
    
      // Button from the binder
      @UiField Button saveBtn;
    
      public SetupDataPage(){
            addDomHandler(new ChangeHandler() {
    
                @Override
                public void onChange(ChangeEvent event) {
                    saveBtn.setEnabled(true);
                }
            }, ChangeEvent.getType());
      }
    }
    

    注意这将触发SetupDataPage中所有文本框的事件。另一方面,它可能不适用于某些特定的小部件。我知道它适用于GWT的文本框、复选框、列表框…

    DOM处理程序更好,执行速度更快。

    +1该组线程中链接的视频是纯金的。我只想补充一点,您应该在进入循环之前定义
    changeholder
    ,然后重用它-无需为每个元素创建/实例化它。更改处理程序的问题是它们在“焦点丢失”事件中执行。所以您需要在文本框中键入一个值,然后使用TAB键或单击某个位置,然后您的处理程序将被执行。此外,此“值更改”事件将阻止“鼠标单击”。e、 g.在文本字段中键入一个值,然后单击一些“更新”按钮。您的“更改”处理程序将被执行,但您的鼠标单击处理程序将不会被执行。这对我们很有效。加载带有domHandler的页面时是否存在任何性能问题?@Tihom我们没有注意到任何问题,但没有进行任何高级性能测试。这主要是有效的。我们在IE中发现了一个例外,如果页面有一个列表框。在IE中更改列表框中的值不会触发dom上的ChangeEvent。我必须在列表框上添加一个显式的更改处理程序,以使其正常工作