ExtJS - 覆盖默认存储数据

Posted

技术标签:

【中文标题】ExtJS - 覆盖默认存储数据【英文标题】:ExtJS - Overwrite default store data 【发布时间】:2021-12-12 20:34:24 【问题描述】:

在 ExtJS 6.2 中,有一个包含一些默认数据的存储,我如何用数据库中的数据覆盖默认数据?

例子:

var store = Ext.create('Ext.data.Store', 
    fields: ['name', 'email', 'phone'],
    data: [
        'name': 'Lisa',
        "email": "lisa@simpsons.com",
        "phone": "555-111-1224"
    , 
        'name': 'Bart',
        "email": "bart@simpsons.com",
        "phone": "555-222-1234"
    , 
        'name': 'Homer',
        "email": "home@simpsons.com",
        "phone": "555-222-1244"
    , 
        'name': 'Marge',
        "email": "marge@simpsons.com",
        "phone": "555-222-1254"
    ],

    //idProperty: 'name',

    proxy: 
        type: 'ajax',
        url: 'data1.json',
        reader: 
            type: 'json',
            rootProperty: 'items',
            totalProperty: 'total'
        
    
);

然后,在我的数据库中,丽莎实际上有电话号码“555-111-4321”,所以当我拨打store.load() 时,它将用“555-111-4321”覆盖丽莎的电话号码。

请看小提琴:https://fiddle.sencha.com/#view/editor&fiddle/3h05

【问题讨论】:

对不起,我不明白。您的小提琴会这样做,它首先使用默认数据加载,但很快它就会被 data1.json 中的数据替换。究竟需要什么? @PeterKoltai 这不是为我替换数据,而是在加载更多数据,在网格中它将显示 2 个 Lisa,而不是更新后的电话号码。 但是您的data1.json 本身包含两个 Lisas!所以当你加载它时,它会用两个 Lisas 替换网格内容,正如预期的那样。 @PeterKoltai 抱歉,我更新了小提琴。发生的情况是它从存储中删除所有内容并替换为 JSON 中的值,因此Homer 也被删除,我想添加新行(如果存在)并更新现有行,但不要删除任何行. 【参考方案1】:

可能有一个更优雅的解决方案,内置 ExtJS,但是在添加新行之前手动检查现有行并从原始存储中删除这些行。将这些行添加到小提琴代码的末尾:

newStore = Ext.clone(store);
newStore.load(addRecords: true,
    callback: function (records, operation, success) 
        if (!success) return;
        Ext.Array.each(records, function(record) 
           const existing = store.findRecord('name', record.get('name'));
           if (existing != null) 
               store.remove(existing);
           
           store.add(record);
        );
    
);

【讨论】:

以上是关于ExtJS - 覆盖默认存储数据的主要内容,如果未能解决你的问题,请参考以下文章

在 ExtJS 中获取一定值的数据存储

ExtJS 4:存储数据未填充存储加载回调函数中的数据

ExtJS4 更改数据存储参数

如何使用 JSON 数据数组加载 extjs 3.4 存储

WCF 表数据到 ExtJS 存储

ExtJS:重新加载数据存储而不重绘网格