2013-07-31 79 views
4

我知道你可以在設置dijit元素的值(即textbox.set('value',value,false))時阻止onChange的觸發。重置dijit.form.Form(form.reset())時有沒有辦法做到這一點?Form.reset()沒有發射onChange

我的問題源於試圖跟蹤髒的表單(即,文本框值已更改)。我捕獲窗體中控件的onChange事件。問題在於form.reset()發送每個控件的onChange事件,這些事件被重置回控制初始狀態。所以form.reset()將設置我的髒旗,因爲每個控制重置觸發onChange。

我已經看到可能的解決方案,包括通過控件重置窗體控件,設置值_lastValueReported,然後設置控件的值,但似乎應該有一個更簡單的解決方案。

如果在表單上有isDirty()方法,那將是完美的。

還是有更好的方法來跟蹤何時表單髒?

回答

0

有沒有辦法阻止onChange事件調用reset()功能的時候,現在,看着the code被觸發,當您使用dijit/form/Form::reset()是,它會調用形式的每一個後代窗口小部件的reset()功能會發生什麼:

reset: function(){ 
    array.forEach(this._getDescendantFormWidgets(), function(widget){ 
     if(widget.reset){ 
      widget.reset(); 
     } 
    }); 
}, 

復位功能(窗體部件從_dijit/form/_FormValueMixin繼承的至少全部)是implemented這樣的:

reset: function(){ 
    this._hasBeenBlurred = false; 
    this._setValueAttr(this._resetValue, true); 
} 

正如你所看到的,它只是簡單地調用_setValueAttr()並且定義了第二個參數(它觸發了更改事件)。


所以,改變這種行爲的唯一方法是通過重寫必要的方法來實現它。例如:

var MyForm = declare("my/Form", [ Form ], { 
    reset: function(priorityChange) { 
     array.forEach(this._getDescendantFormWidgets(), function(widget){ 
      if(widget.reset) { 
       widget.reset(priorityChange); 
      } 
     }); 
    } 
}); 

var myTextBox = declare("my/TextBox", [ TextBox ], { 
    reset: function(priorityChange) { 
     this._hasBeenBlurred = false; 
     this._setValueAttr(this._resetValue, priorityChange); 
    } 
}); 

這使您可以添加一個名爲priorityChangereset()功能參數,它允許您觸發事件(或沒有)。

完整的例子可以的jsfiddle發現:http://jsfiddle.net/f954z/


如果你不想重新實現所有表單控件的reset()功能(我只是做dijit/form/Formdijit/form/TextBox),那麼最好你能do是打開票並希望它得到實施。

+0

謝謝,已經很久了,我不得不回去看看我最終做了什麼。我實際上在我的應用程序中爲每個表單創建了一個重置​​,並且它實質上是通過.set然後是._lastValueReported對錶單中每個元素進行重置。 – user2638303