在 ExtJs 4 网格中强制执行唯一键值

Posted

技术标签:

【中文标题】在 ExtJs 4 网格中强制执行唯一键值【英文标题】:Enforce unique key values in ExtJs 4 grids 【发布时间】:2012-07-31 22:26:07 【问题描述】:

我正在 ExtJs 4 中设计一个网格来表示 Map 数据结构。我有一个用于网格中 key 列的自定义单元格编辑器。我想强制执行 key 在所有键中必须是唯一的这一事实。我该怎么做?

目前我正在尝试使用自定义验证器设置一个特殊的文本字段编辑器,通过将其与数据存储的值进行比较来检查用户提交的 key 值是否唯一。不幸的是,这遇到了数据存储不知道什么是“当前”记录,因此在检查重复项时不知道要排除哪个记录的问题。

^令人困惑,对吧?这就是为什么我认为我做错了。

【问题讨论】:

【参考方案1】:

这是一个非常好的问题,我最终做了你正在做的事情。为了处理当前记录以便我可以将其从查找中排除,我在vtype 验证函数中添加了类似的内容:

unique: function (val, field) 
  // If field has not been changed - don't care about anything else
  if (field.originalValue === undefined || val === field.originalValue) 
    // _trace('unique - original value has not changed'); 
    return true;
  

  if (!field.isDirty()) 
    // _trace('unique - field is not dirty'); 
    return true;
  

  // Check you store here...
,
uniqueText: 'Duplicate'

还有一点需要注意 - 如果您将尝试在对话框中使用相同的验证器(与网格行编辑器相反) - 您将需要添加更多检查,因为 originalValue 不会始终正确设置(至少我必须这样做这在我的应用程序中的 4.0.7 中)。

【讨论】:

感谢您的回答!我以前没见过vtype,我调查了一下。但我不知道field 是什么。您能解释一下在 Ext Js 网格的上下文中传递到 unique: function(val,field) 的内容吗?非常感谢! field 将引用编辑器。当您将 roweditor 用于网格时,它实际上会为每一列创建一个 Ext.form.field.Textfield。 val 显然是您需要检查的值。 酷,谢谢你!我会试一试,如果没有人发布另一个解决方案并且它有效,那么我会接受它

以上是关于在 ExtJs 4 网格中强制执行唯一键值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Django 模型在 ExtJS 网格中获取外键值而不是键?

ExtJS 4.1 如何更改网格面板标题高度

IE9 中的 extjs 4 主题化问题,网格栏颜色和按钮不会改变

EXTjs 4.2.1 加载网格数据时显示默认数据

在 ExtJs 4.1 中使用一个网格作为分组网格和普通网格

使用 extjs 网格并行执行