1

我在表单中使用了一个非常简单的 RadioGroup。我的表单通过 form.loadRecord() 方法填充了一条记录,然后我使用 form.updateRecord() 根据表单中的值更新记录。它有效,我可以加载记录并保存它们,此时没问题。

当我想使用它的方法 isDirty() 检查表单的脏状态时,就会出现问题。它总是“真实的”。我基本上知道为什么,那是因为 RadioGroup 的原始值始终等于“0”,并且不是由 loadRecord() 设置的(它只是将值应用于 adhoc radiogroup 的子级)。

-> form.getFields().items[10].originalValue = 评分:“0”

-> form.getFields().items[10].getValue() = 评分:“3”

我应该补充一点,其他字段中的 NONE 都是脏的(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"
    }
]

谢谢你的帮助!

4

2 回答 2

1

从 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 )

研究/细节:

从 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();
        }
    }
}

您可以看到它在通过给定 fieldId(字段名称)找到的第一个字段上调用 ​​setValue,然后 resetOriginalValue。我们看一下Ext.form.field.Radio中的setValue:

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(通过在基本形式的 setValues 中调用 findField 找到的第一个)。

因此,无线电字段的 setValue 已变得“智能”。现在,radio 字段的 resetOriginalValue 怎么样?从未实现无线电字段的专用 resetOriginalValue - 它只是从 Ext.form.field.Field 中的默认值继承,如下所示:

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

然后解决方法是使无线电的 resetOriginalValue 与其 setValue 一样“智能”,即考虑到无线电组中有多个具有相同名称的无线电字段。

于 2012-03-03T01:53:48.040 回答
1

这只是表单的一般行为,显然默认情况下表单没有字段值,当您加载数据时,它显然会更改并使表单变脏。

当我不得不依赖isDirty()我手动重置表单字段值的方法时......

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

虽然这不是一个修复程序,但它应该可以作为临时解决方法。看起来这可能是一个错误,可能值得在 Sencha 论坛上发布

于 2011-06-29T22:22:59.140 回答