ExtJS 4, проблема с радиогруппой, которая всегда "грязная" - PullRequest
1 голос
/ 27 июня 2011

Я использую очень простую RadioGroup в форме.Моя форма заполняется записью с помощью метода form.loadRecord (), и позже я обновляю запись в зависимости от значений в моей форме, используя form.updateRecord ().Это работает, я могу загрузить записи и сохранить их, без проблем на данный момент.

Проблемы возникают, когда я хочу проверить грязное состояние формы, используя ее метод isDirty ().Это ВСЕГДА "правда".Я в основном знаю почему, и это потому, что исходное значение RadioGroup всегда равно «0» и не устанавливается loadRecord () (оно просто применяет значение к дочернему элементу радиогруппы adhoc).

-> form.getFields (). items [10] .originalValue = Рейтинг: "0"

-> form.getFields (). items [10] .getValue () = Рейтинг: "3"

Я должен добавить, что ни одно из других полей не является грязным (trackResetOnLoad установлен на true в форме, что позволяет форме быть сброшенной при загрузке записи).Эта проблема возникает только с радиогруппой.

Вот код радиогруппы, которую я использую.Я пытался добавить "name: 'Rating'" в радиогруппу, но она вылетает (очевидно, она работала в ExtJS 3.x).

xtype : 'radiogroup',
fieldLabel: 'Rating',
items: [
    {
        boxLabel  : 'Zero',
        name      : 'Rating',
        inputValue: "0"
    }, {
        boxLabel  : 'One',
        name      : 'Rating',
        inputValue: "1"
    }, {
        boxLabel  : 'Two',
        name      : 'Rating',
        inputValue: "3"
    }
]

Спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 03 марта 2012

Это все еще ошибка с версии 4.0.7.Вот короткое переопределение, чтобы исправить это:

Ext.override(Ext.form.field.Radio, {
    resetOriginalValue: function () {
        //Override the original method inherited from Ext.form.field.Field: 
        //  this.originalValue = this.getValue();
        //  this.checkDirty();
        this.getManager().getByName(this.name).each(function (item) {
            item.originalValue = item.getValue();
            item.checkDirty();
        });
    }
});

(Вы также можете прочитать обсуждение и мой оригинальный ответ в ветке форума Sencha здесь: http://www.sencha.com/forum/showthread.php?182524-RadioField-and-isDirty-problem&p=745308&viewfull=1#post745308)

Research /детали:

Начните с источника для Ext.form.Basic, метод setValues. Внутри метода setValues ​​есть вспомогательная функция setVal, которая выглядит следующим образом:

function setVal(fieldId, val) {
    var field = me.findField(fieldId);
    if (field) {
        field.setValue(val);
        if (me.trackResetOnLoad) {
            field.resetOriginalValue();
        }
    }
}

Вы можете видеть этовызывает setValue для первого поля, которое находит по заданному fieldId (имя поля), а затем resetOriginalValue. Давайте посмотрим на setValue в Ext.form.field.Radio:

setValue: function(v) {
    var me = this,
        active;

    if (Ext.isBoolean(v)) {
        me.callParent(arguments);
    } else {
        active = me.getManager().getWithValue(me.name, v).getAt(0);
        if (active) {
            active.setValue(true);
        }
    }
    return me;
}

Этот специализированный метод setValue учитывает, что существует несколько радиостанций с одним и тем же именем , и что setValue вызывается только для одного из них (первый найден путем вызова findField в setValues ​​базовой формы).

Итак, setValue для радиополя сделано «умным». Теперь, что насчет resetOriginalValue для радиополя? Специализированный resetOriginalValue для радиополя никогда не был реализован -просто наследуется от значения по умолчанию в Ext.form.field.Field, которое выглядит следующим образом:

resetOriginalValue: function() {
    this.originalValue = this.getValue();
    this.checkDirty();
}

Исправление заключается в том, чтобы сделать resetOriginalValue для радио столь же «умным», как их setValue, т.е. принять во внимание, чтов группе радиостанций есть несколько полей с одним и тем же именем.

1 голос
/ 30 июня 2011

Это просто поведение формы в целом, очевидно, что по умолчанию форма не имеет значений полей, и когда вы загружаете данные, она, очевидно, изменяется и загрязняет форму.

Когда мне приходилось полагаться на метод isDirty(), я сбрасывал значение поля формы вручную ...

Ext.getCmp('fieldId').resetOriginalValue();

Хотя это и не является исправлением, все должно быть в порядке временного решения. Похоже, это может быть ошибкой, возможно, стоит опубликовать на форуме Sencha

...