4

textbox.set('value',value,false)dijit 要素 (ie. )の値を設定するときに 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()ご覧のとおり、2 番目の引数を定義して を呼び出すだけです(これにより、変更イベントがトリガーされます)。


したがって、この種の動作を変更する唯一の方法は、必要なメソッドをオーバーライドして自分で実装することです。例えば:

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)、チケットを開いて実装されることを祈るしかありません。

于 2014-06-19T06:24:13.970 に答える