【问题标题】:ExtJS 4, issue with a radiogroup which is always "dirty"ExtJS 4,总是“脏”的无线电组问题
【发布时间】:2011-09-23 08:48:37
【问题描述】:

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

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

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

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

我应该补充一点,其他字段中没有一个是脏的(trackResetOnLoad 在表单上设置为 true,这允许在加载记录时重置表单)。此问题仅发生在 radiogroup 中。

这是我使用的无线电组的代码。我尝试将“名称:'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"
    }
]

感谢您的帮助!

【问题讨论】:

  • 为什么你需要知道表单是否为isDirty()?我认为这可能有助于我回答您的问题。
  • 在加载表单数据之前 是否脏了?我猜不是
  • dmackerman > 我实际上是在列出dirtychange事件以启用/禁用保存按钮。
  • Jaitsu > 一开始它并不脏,但是一旦我在其中加载记录,它就会变脏。并且只有无线电组是脏的。

标签: forms extjs record extjs4 radio-group


【解决方案1】:

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

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

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

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

【讨论】:

  • 好主意,所以我现在要做的是在我正在使用的每个无线电组上调用 resetOriginalValue() ,并且一切正常。但是,是的,这仍然是一种解决方法。谢谢:)
【解决方案2】:

这仍然是 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 一样“智能”,即考虑到无线电组中存在多个具有相同名称的无线电字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    相关资源
    最近更新 更多