我知道在设置dijit元素(即textbox.set('value',value,false)
)的值时可以防止onChange的触发。在重置dijit.form.form(form.reset()
)时,有办法做到这一点吗?
我的问题源于试图跟踪脏的表单(即文本框值已更改)。我捕获了表单中控件的onChange事件。问题是form.reset()为每个重置回控件初始状态的控件发送onChange事件。因此,form.reset()
将设置我的脏标志,因为每次控件重置都会触发onChange。
我看到了一些可能的解决方案,包括逐个控件重置窗体控件,设置_lastValueReported
值,然后设置控件的值,但似乎应该有一个更简单的解决方案。
如果表单上有一个isDirty()
方法,那将是完美的。
或者有更好的方法来跟踪表单何时脏了吗?
到目前为止,在调用reset()
函数时,没有办法阻止onChange事件被触发。从代码来看,当您使用dijit/form/Form::reset()
时,它会调用该形式的每个子代小部件的reset()
函数:
reset: function(){
array.forEach(this._getDescendantFormWidgets(), function(widget){
if(widget.reset){
widget.reset();
}
});
},
重置功能(至少是从_dijit/form/_FormValueMixin
继承的所有表单窗口小部件)是这样实现的:
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);
}
});
这允许您将一个名为priorityChange
的参数添加到reset()
函数中,该函数允许您触发(或不触发)事件。
一个完整的例子可以在JSFiddle上找到:http://jsfiddle.net/f954z/
如果你不想重新实现所有表单小部件的reset()
功能(我只做了dijit/form/Form
和dijit/form/TextBox
),那么你能做的最好的事情就是打开一个票证,希望它能实现。