我知道你可以在设置dijit元素的值时阻止onChange的触发(即textbox.set('value',value,false)
)。有没有办法在重置dijit.form.Form(form.reset()
)时执行此操作?
我的问题源于试图跟踪脏的表单(即文本框值已更改)。我捕获表单中控件的onChange事件。问题是form.reset()为每个重置回控制初始状态的控件发送onChange事件。因此,form.reset()
将设置脏标志,因为每次控制重置都会触发onChange。
我见过可能的解决方案,涉及通过控制重置表单控件,设置_lastValueReported
值,然后设置控件的值,但似乎应该有一个更简单的解决方案。
如果表单上有isDirty()
方法,那将是完美的。
还是有更好的方法来跟踪表单何时变脏?
答案 0 :(得分:0)
现在调用reset()
函数时无法阻止触发onChange事件,查看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);
}
});
这允许您向priorityChange
函数添加一个名为reset()
的参数,该参数允许您触发事件(或不激活)。
可以在JSFiddle上找到完整的示例:http://jsfiddle.net/f954z/
如果您不想重新实现所有表单小部件的reset()
功能(我只执行dijit/form/Form
和dijit/form/TextBox
),那么您可以做的最好的事情就是打开一个票,并希望它得到实施。