2015-05-26 81 views
0

在我目前的項目中,我必須處理更復雜的表格。如果某個特定字段(我將其命名爲'C')接收到用戶輸入,字段(我會將它們命名爲'A'和'B')會自動填充。但是,如果用戶將數據輸入到字段A中,字段B和C也會自動填寫。處理更復雜的表格

(這只是一個簡單的例子中,電流邏輯是有點複雜)

我必須照顧的是,沒有周期發生(C - > A - >Ç - > A - > ...)。所以我現在需要現在如果當前值更改是由於用戶輸入或另一個已接收輸入的字段,然後觸發了當前字段的值更改。而且現在我還需要在第二種情況下哪個字段完全觸發值更改,因爲那麼我必須觸發其他與誰觸發價值更改相關的具體操作。

  • Vaadin有沒有處理這種形式 結構的一般方法?目前的問題是,我現在根本就不會在 或什麼觸發什麼ValueChangeEvent。
  • 有框架來處理這個問題還是我忽略了現有的Vaadin模式?

回答

3

在Vaadin valueChange事件的處理是有點痛,因爲它始終閃光,不管用戶是否已經改變了一些東西,或應用程序使用了組件上的setValue(....)。

唯一的解決方法是記住在應用程序中執行setValue(....),然後禁用其他組件中的觸發器代碼。

例如,在這種情況下(無限循環):

field1.addValueChangeListener(field2.setValue('Updated by field1'); 
field2.addValueChangeListener(field1.setValue('Updated by field2'); 

改變這種方式:

boolean inTrigger= false; 

field1.addValueChangeListener( 
    { 
     if (!inTrigger) 
     { 
      inTrigger= true; 
      field2.setValue('Updated by field1'); 
      inTrigger= false; 
     } 
    }); 
field2.addValueChangeListener( 
    { 
     if (!inTrigger) 
     { 
      inTrigger= true; 
      field1.setValue('Updated by field2'); 
      inTrigger= false; 
     } 
    }); 

這樣就可以防止更新循環,讓執行代碼的一次。

+0

我擴展了這個方法,基本上把'inTrigger'類改爲'AbstractField',所以我可以做輸入源相關邏輯。 –