Forms Form.reset()不触发onChange

Forms Form.reset()不触发onChange,forms,dojo,reset,Forms,Dojo,Reset,我知道在设置dijit元素的值(即textbox.set('value',value,false))时,可以防止触发onChange。重置dijit.form.form(form.reset())时,有没有办法做到这一点 我的问题源于试图跟踪脏的表单(例如,textbox值已更改)。我捕获表单中控件的onChange事件。问题是form.reset()为每个重置为控件初始状态的控件发送onChange事件。因此,form.reset()将设置我的脏标志,因为每次控件重置都会触发一次更改 我见过可

我知道在设置dijit元素的值(即
textbox.set('value',value,false)
)时,可以防止触发onChange。重置dijit.form.form(
form.reset()
)时,有没有办法做到这一点

我的问题源于试图跟踪脏的表单(例如,textbox值已更改)。我捕获表单中控件的onChange事件。问题是form.reset()为每个重置为控件初始状态的控件发送onChange事件。因此,
form.reset()
将设置我的脏标志,因为每次控件重置都会触发一次更改

我见过可能的解决方案,包括逐个控件重置表单控件,设置
\u lastValueReported
值,然后设置控件的值,但似乎应该有一个更简单的解决方案

如果表单上有一个
isDirty()
方法,那就太完美了


或者有没有更好的方法来跟踪表单何时变脏?

目前,在调用
reset()
函数时无法防止触发onChange事件。现在,看看,当您使用
dijit/form/form::reset()
时,它将调用
reset())
该表单的每个后代小部件的功能:

reset:function(){
array.forEach(this.\u getDegenantFormWidgets(),函数(widget){
if(widget.reset){
widget.reset();
}
});
},
重置功能(至少是从
\u dijit/form/\u FormValueMixin
继承的所有表单小部件)如下所示:

reset:function(){
这个._hasBeenBlurred=false;
this.\u setValueAttr(this.\u resetValue,true);
}
如您所见,它只需调用
\u setValueAttr()
,并定义第二个参数(触发更改事件)


因此,改变这种行为的唯一方法是通过重写必要的方法自己实现它。例如:

var MyForm=declare(“我的/Form”,[Form]{
重置:功能(优先级更改){
array.forEach(this.\u getDegenantFormWidgets(),函数(widget){
if(widget.reset){
控件重置(优先级更改);
}
});
}
});
var myTextBox=declare(“我的/TextBox”,[TextBox]{
重置:功能(优先级更改){
这个._hasBeenBlurred=false;
this.\u setValueAttr(this.\u resetValue,priorityChange);
}
});
这允许您将名为
priorityChange
的参数添加到
reset()
函数中,该函数允许您触发(或不触发)事件

可以在JSFIDLE上找到完整的示例:



如果你不想重新实现所有表单小部件的
reset()
功能(我只做了
dijit/form/form
dijit/form/TextBox
),那么你最好打开一张票,希望它能实现。

谢谢,太久了,我不得不回去看看我最后做了什么。实际上,我在我的应用程序中为每个表单创建了一个重置,它基本上使用.set和.u lastValueReported对表单中的每个元素进行重置。