2013-07-31 3 views
4

Я знаю, что вы можете предотвратить срабатывание onChange при установке значения элементов диджета (то есть textbox.set('value',value,false)). Есть ли способ сделать это при сбросе dijit.form.Form (form.reset())?Form.reset() без включения onChange

Моя проблема связана с попыткой отслеживать грязную форму (то есть значение текстового поля изменилось). Я фиксирую события onChange для элементов управления в форме. Проблема в том, что form.reset() отправляет событияChange для каждого элемента управления, который вернулся к исходному состоянию элемента управления. Таким образом, form.reset() установит мой грязный флаг, так как каждый сброс управления срабатывает в режиме «Изменить».

Я видел возможные решения, связанные с сбросом форм управления с помощью управления, установив значение _lastValueReported, а затем установив значение элемента управления, но, похоже, должно быть более простое решение.

Если бы на форме был метод isDirty(), это было бы идеально.

или есть лучший способ отслеживать, когда форма грязная?

ответ

0

Там нет никакого способа, чтобы предотвратить событие OnChange, которые инициированы при вызове функции reset() как сейчас, глядя на 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/Form и dijit/form/TextBox), то лучшее, что вы можете do открывает билет и надеется, что он будет реализован.

+0

Спасибо, мне так долго приходилось возвращаться и видеть, что я делал. Я фактически создал сброс для каждой формы в моем приложении, и по сути делает сброс на каждый элемент в форме с .set, а затем на ._lastValueReported. – user2638303