【问题标题】:How to set Ext.Form dirty state?如何设置 Ext.Form 脏状态?
【发布时间】:2012-12-30 17:57:08
【问题描述】:

如何将表单的状态dirty更改为false

Ext.Form.PanelsetDirty(false)之类的方法吗?

UPD:

我的任务是跟踪 Form 脏状态,以便仅在表单发生任何更改时才启用停靠的 SAVE 按钮。

我正在跟踪dirtychange 事件:

init: function() {
    this.control({
        'form': {
            dirtychange: function(form) {
                alert('change');      
            }
        }
    });
}

但是当我通过loadRecord() 方法将记录加载到表单中时,我在加载记录时收到chage 警报,并且在加载记录后表单变脏。

我想在记录加载后立即重置表单的dirty 状态,并开始跟踪记录填写表单上的dirtychange 事件。

有什么想法吗?

【问题讨论】:

    标签: extjs


    【解决方案1】:

    更正

    有一个可用的属性可以在设置值时更改原始值。

    trackResetOnLoad: 真

    看到这个JSFiddle

    下面的旧答案可能会不方便,但我让它保持不变

    首先我得说你找不到任何这样的方法

    那是因为表单没有这样的状态,字段有它。表单所做的只是遍历每个字段并检查它是否脏。如果任何字段是脏的,它将检查该值(脏标记)自上次检查以来是否已更改,如果是,则触发 dirtychange 事件。然后将其保存为最后一次检查 (wasDirty)

    现在让我们看看这些字段,因为它们真正触发了它:

    他们通过检查!me.isEqual(me.getValue(), me.originalValue) 来检查onChangeonReset,其中originalValue 是在调用initValue 时设置的值。

    现在如何“设置”表单不再“脏”

    Ext.form.Basic 上使用getFields() 遍历表单的所有字段,现在我们将通过在每个字段上调用initValue 将当前值设置为原始值(现在重置将重置为此值),仅此而已。

    删除了错误的代码

    编辑

    好吧,我已经将上面的最后一个代码修改为

    var items = form.getForm().getFields().items,
          i = 0,
          len = items.length;
      for(; i < len; i++) {
        var c = items[i];
        if(c.mixins && c.mixins.field && typeof c.mixins.field['initValue'] == 'function') {
          c.mixins.field.initValue.apply(c);
          c.wasDirty = false;
        }
    }
    

    并派生了一个 working example。在检测到任何更改之前,该按钮将保持非活动状态,如果您删除更改,它将再次设置为非活动状态。玩弄它我猜这就是你要找的东西。

    【讨论】:

    • 看起来Ext.Form.Field 也没有setDirty() 方法。
    • @s.webbandit 我发现了一个几乎相同的属性(请参阅我的编辑)
    【解决方案2】:

    有方法reset()。如果不带参数使用,它会保留使用loadRecord() 加载的表单数据。

    所以如果你在加载数据后调用reset(),你的表单应该不会再脏了。

    myForm.loadRecord(record);
    myForm.reset();
    

    我认为dirtychange事件也会通过加载数据被调用,但是在reset()之后你可以用isDirty()查看表单。

    【讨论】:

    • 这是不正确的,它只会保留绑定到表单的记录实例而不是加载的值。
    • 您是否阅读了 Ext.form.Basic.reset() 的 ExtJS 文档?我遇到了问题,我想检查用户单击“关闭”时对话框是否发生了更改。如果是,我警告用户,有未保存的更改。我正在将一些带有loadRecord() 的数据加载到表单中。我的表单总是很脏,因为我发现 reset() 在加载数据后会创建一个不脏状态。
    • 你读了吗?但重要的是何时加载记录,因为如果表单呈现并显示为空,则此值存储为 originalValuereset() 会将 this originalValue 恢复到该字段。如果设置为 true,布尔 arg 只会擦除记录引用。因此,如果您在字段初始化后加载记录,reset 将清除字段中的所有值,除非您在字段初始化之前加载记录或将 trackResetOnLoad 属性设置为 true(这将覆盖 originalValue)
    【解决方案3】:

    这里的解决方法是使用隐藏字段并设置它的值以强制表单变脏。我们在不包含表单字段的小部件中使用它。要将表单设置为脏,我们只需更改隐藏字段的值,将其设置为干净,我们将其重置为原始值。

    【讨论】:

      猜你喜欢
      • 2019-06-08
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 2021-09-23
      • 2021-06-30
      • 2019-05-15
      • 1970-01-01
      • 2019-04-02
      相关资源
      最近更新 更多