ExtJS 4, проблема с радиогруппой, которая всегда грязная

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

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

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

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

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

Вот код радиогруппы, которую я использую. Я попытался добавить «имя: «Рейтинг»» в радиогруппу, но она вылетает (видимо, она работала в 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"
    }
]

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


person TigrouMeow    schedule 27.06.2011    source источник
comment
Почему именно вам нужно знать, является ли форма Dirty() или нет? Думаю, это может помочь мне ответить на ваш вопрос.   -  person dmackerman    schedule 27.06.2011
comment
это грязно перед загрузкой данных формы? я думаю нет   -  person JamesHalsall    schedule 27.06.2011
comment
dmackerman › На самом деле я вывожу список событий dirtychange для того, чтобы включить/отключить кнопку сохранения.   -  person TigrouMeow    schedule 28.06.2011
comment
Jaitsu › Он не грязный в самом начале, но как только я загружаю в него запись, он становится грязным. И только радиогруппа грязная среди полей.   -  person TigrouMeow    schedule 28.06.2011


Ответы (2)


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

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

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

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

person JamesHalsall    schedule 29.06.2011
comment
Хорошая идея, поэтому сейчас я вызываю resetOriginalValue() для каждой радиогруппы, которую использую, и все работает правильно. Но да, это все еще обходной путь. Спасибо :) - person TigrouMeow; 01.07.2011

Это все еще ошибка версии 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-проблема&p=745308&viewfull=1#post745308)

Исследования/детали:

Начните с источника для 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, то есть принять во внимание, что в группе радиостанций есть несколько полей радиостанций с одинаковыми именами.

person Vais Salikhov    schedule 03.03.2012