检查商店(或记录)是不是已被编辑?

Posted

技术标签:

【中文标题】检查商店(或记录)是不是已被编辑?【英文标题】:Check if a store (or records) have been edited?检查商店(或记录)是否已被编辑? 【发布时间】:2011-12-22 02:30:13 【问题描述】:

我有一个网格面板,当我离开页面时,我想要检查商店中是否有任何项目(或遍历模型/记录)以检查是否有任何未保存的更改/添加。

我最初尝试将panel.getStore().getNewRecords() 用于新记录,但它会返回当前分页的每条记录。panel.getStore().getUpdatedRecords() 似乎忽略了记录,尽管网格中的线条在每个单元格中都有红色小三角形。

那么任何人都可以建议检查商店中是否存在任何新记录或更新记录的正确方法吗?

【问题讨论】:

【参考方案1】:

这可能对你有用。

var records = store.getRange();

for (var i = 0; i < records.length; i++) 
    var rec = records[i];

    if (rec.dirty == true) 
        //Save data
    

【讨论】:

【参考方案2】:

为了保持脏检查逻辑被封装,我选择在Ext.data.Store对象中添加一个isDirty()方法。我使用了与AbstractStore.sync() 相同的逻辑来确定商店是否需要同步。

Ext.define(null, 
    override: "Ext.data.Store",
    isDirty: function() 
        return (this.getNewRecords().length > 0 || this.getUpdatedRecords().length > 0 || this.getRemovedRecords().length > 0);
    
);

我正在使用 ExtJS 4.2.1。如果调用 getNewRecords() 时返回了所有记录,则应检查是否已在模型上为 idProperty 设置值。

【讨论】:

【参考方案3】:

你可以使用类似下面的代码:

if(panel.getStore().getModifiedRecords().length > 0) 
  console.log('store has dirty records');

【讨论】:

【参考方案4】:

我用这个:

isStoreModified: function(store)

  var modifiedRecords = store.getModifiedRecords();
  return modifiedRecords && modifiedRecords.length  && modifiedRecords.length > 0;
,

【讨论】:

TypeError: Object [object Object] 没有方法'getModifiedRecords' 你用的是什么版本的 Ext Js?该函数在 AbstractStore 中,我通过搜索 Ext Js 4.1.3 和 4.2.1 源代码进行了仔细检查。看到这个:docs.sencha.com/extjs/4.2.1/#!/api/…【参考方案5】:
if (panel.getStore().needsSync) 
    //store have unsaved changes.

【讨论】:

这不是 ExtJS API 中的公共属性。【参考方案6】:

如果您不熟悉这里的覆盖,@jstrickers 是 mvc 样式程序的答案:

创建:

    Ext.define('YourFolder.overridefolder.DataStore',  

    override: "Ext.data.Store",
    isDirty: function() 
        return (this.getNewRecords().length > 0 || this.getUpdatedRecords().length > 0 || this.getRemovedRecords().length > 0);
    

);

将此文件添加到适当的文件夹并在 app.js 'required' 中指向它,然后 isDirty 将在您的 ext.data.store 中可用

效果很好,该功能将在您需要时可用。

【讨论】:

【参考方案7】:

我基于@theboulderer 的回答。我知道这是一个旧线程,但我认为它可能对找到此页面的其他人有用。

我使用的是 MVC 模型,所以请记住这一点。

您所要做的就是将 store 传递给函数,它会返回一个布尔值。

用法:

if (this.isDirtyStore(myStore))
    ...

功能:

isDirtyStore: function(theStore)
    var isDirty = false;

    theStore.each(function(item)
        if(item.dirty == true)
            isDirty = true;
        
    );
    if (!isDirty)
        isDirty = (theStore.removed.length > 0);
    
    return isDirty;

【讨论】:

【参考方案8】:

shw 在这个帖子How do I get the dirty records from an ExtJS data store? 中的回答,回答了你的问题。

诀窍是存储读取器需要指定一个 idProperty,否则所有行都被视为新行。

他们也提供了一个例子。

【讨论】:

以上是关于检查商店(或记录)是不是已被编辑?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查麦克风是不是已被使用或没有颤振?

MS Access -“自从您开始编辑此记录以来,该记录已被其他用户更改”

Laravel:检查记录ID是不是存在

如何检查传入的 JSON 提要是不是包含单条记录或多条记录?

检查FMDB中某条记录之后或某条记录之前是不是存在行

如何检查记录是不是已经存在,然后在 laravel 中更新或插入?