9

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

有类似setDirty(false)的方法Ext.Form.Panel吗?

升级版:

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

我正在跟踪dirtychange事件:

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

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

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

有任何想法吗?

4

3 回答 3

16

更正

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

trackResetOnLoad:真

看到这个JSFiddle

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

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

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

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

他们正在通过检查调用时间onChange的值在哪里onReset来检查字段是否脏。!me.isEqual(me.getValue(), me.originalValue)originalValueinitValue

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

getFields()现在使用on遍历表单的所有字段,Ext.form.Basic我们将通过调用每个字段将当前值设置为原始值(reset 现在将重置为此值),仅此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;
    }
}

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

于 2013-01-16T12:35:45.927 回答
1

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

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

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

我认为,该dirtychange事件也将通过加载数据来调用,但之后reset()您可以使用isDirty().

于 2013-01-21T09:24:15.707 回答
1

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

于 2014-11-24T07:47:45.617 回答