Form.reset()而不在Change上启动



我知道在设置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/Formdijit/form/TextBox),那么你能做的最好的事情就是打开一个票证,希望它能实现。

最新更新