2016-01-12 25 views
4

我试图更新数据库,一旦我改变了RichTextBox并退出了RichTextBox(即,我不想强​​制用户按下“更新”按钮“)。但是,我的代码在第一行会抛出异常The method addValueChangeHandler(new ValueChangeHandler<String>(){}) is undefined for the type RichTextArea不允许GWT addValueChangeHandler到RichTextBox

       textBoxExistingDescription.addValueChangeHandler(new ValueChangeHandler<String>() { 
           public void onValueChange(ValueChangeEvent<String> event) { 

            //If a record for this Youth Member specific detail line exists then update it else add it. 
            if (ymAwardDetails.getYmsdId() != null) { 
             AsyncCallback<Void> callback = new YMSpecificHandler<Void>(ScoutAwardView.this); 
             rpc.updateYMSpecific(ymAwardDetails.getYmsdId(), ymAwardDetails.getYmsdDetail(), callback); 
            }else{ 
             AsyncCallback<Void> callback = new YMSpecificHandler<Void>(ScoutAwardView.this); 
             rpc.addYMSpecific(youthMemberID, ymAwardDetails.getAdId(), ymAwardDetails.getYmsdDetail(), callback); 
            } 
           } 
          }); 

有没有其他方法可以做到这一点?

回答

5

看着你的需求,我认为你也可以通过实现addBlurHandler()而不是addValueChangeHandler()来实现。

模糊事件当组件失去焦点时被触发。有关模糊事件的更多信息,请参阅this

有关GWT BlurEvent的信息,请阅读this

2

首先,将纯ValueChangeHandler(即使它在那里),将导致您的用户每次发送数据库请求他类型1个的单个字符,这是一个很大的开销,如果你问我

保存备份每次重点丢失可能会更好,但有一种情况是,使用过程中没有点击开箱并仍然以某种方式关闭标签,这是不愉快的。

我的建议是:

  1. 子类RichTextArea:

    公共类MyRichTextArea扩展RichTextArea实现HasValueChangeHandlers {

    @Override 
        public HandlerRegistration addValueChangeHandler(ValueChangeHandler<String> handler) { 
         return this.addHandler(handler, ValueChangeEvent.getType()); 
        } 
    
    } 
    
  2. 创建子类的内部定时器字段。

  3. 在构造函数RichTextBox中添加keyDown事件处理程序:

如果定时器运行 - 延长它的另外3秒,否则启动定时器。

当3秒计时器没有进一步keydowns完成 - 触发一个服务电话来保存您的文本。我就是这样做的

+0

我已经实施了@RAS(谢谢RAS)的解决方案,经过大量测试,这对我没有计时器的作品。无论如何感谢波马。 – Glyn