Form.reset()不触发onChange

时间:2013-07-31 14:02:08

标签: forms dojo reset

我知道你可以在设置dijit元素的值时阻止onChange的触发(即textbox.set('value',value,false))。有没有办法在重置dijit.form.Form(form.reset())时执行此操作?

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

我见过可能的解决方案,涉及通过控制重置表单控件,设置_lastValueReported值,然后设置控件的值,但似乎应该有一个更简单的解决方案。

如果表单上有isDirty()方法,那将是完美的。

还是有更好的方法来跟踪表单何时变脏?

1 个答案:

答案 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/Formdijit/form/TextBox),那么您可以做的最好的事情就是打开一个票,并希望它得到实施。