4

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

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

我已经看到了可能的解决方案,包括通过控件重置表单控件,设置_lastValueReported值,然后设置控件的值,但似乎应该有一个更简单的解决方案。

如果有一个isDirty()方法,那就完美了。

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

4

1 回答 1

0

到目前为止,没有办法阻止在调用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);
    }
});

这允许您添加一个调用函数的参数priorityChangereset()该参数允许您触发(或不触发)事件。

一个完整的例子可以在 JSFiddle 上找到:http: //jsfiddle.net/f954z/


如果您不想重新实现reset()所有表单小部件的功能(我只做过dijit/form/Formand dijit/form/TextBox),那么您能做的最好的事情就是打开一张票并希望它得到实现。

于 2014-06-19T06:24:13.970 回答