ExtJS 4-更新/刷新单个记录

ExtJS 4 - Update/Refresh single record

本文关键字:单个 记录 刷新 更新 ExtJS      更新时间:2023-09-26

我遇到了一个困扰我的问题。

我有一个网格,当我点击一个项目时,我想打开一个窗口来编辑该项目。相当标准的东西。问题是,我想确保记录是最新的,因为其他使用该程序的人可能已经更改甚至删除了它。

我可以重新加载存储,但我只想检查一个特定的记录。。。所以我想我只需要去获取数据,建立另一个记录,并替换商店中现有的记录,但我真的想知道执行的最佳方法

请记住,RESTful代理对我来说不是一个选项,尽管我不知道在这种情况下更新操作是否有效(服务器->客户端)。

编辑:这可能有助于某人:我所做的只是将数据和原始对象从新记录复制到旧记录,然后"提交"更改。为我工作。

谢谢。

ExtJS 4.1

我也遇到了类似的问题,作为一个实验,我尝试了

sStore.load({ id: mskey, addRecords: true });

其中mskey是当前加载的记录的uuid。

I没有首先删除现有记录(作为实验),它更新了与服务器中的新数据具有相同id的现有记录(通过模型-->REST代理)。完美的

我知道你说过你没有使用REST代理,但这可能会帮助其他找到这篇文章的人搜索搜索词,比如你的主题名称(这就是我来到这里的原因!)

因此,看起来"addRecords"的意思是添加更新。

FYI,Murray

执行类似操作的最佳方法是在打开窗口的事件中重新加载记录。因此,例如,在将记录从网格存储加载到窗口内的表单中的地方,可以使用模型从id加载。
Item.load(id, { success: function(r) { form.loadRecord(r); } });

保存后,您可能还应该对网格视图调用refresh,它将重新绘制保存事件中的更改。如果您关心性能,还可以对存储中的确切记录使用refreshNode(请参阅网格视图文档)。

当然,你不必使用restful代理,你可以使用任何代理,只要它能加载单个记录。

使用ExtJS 4.1,这里有一个覆盖:

CoffeeScript:

# Adds "reload" to models
Ext.define "Ext.ux.data.Model",
    override: "Ext.data.Model",
    # callBack is called with success:boolean
    reload: (callBack) ->
        Ext.getClass(@).load @getId(),
            success : (r, o) =>
                for k, v of r.data
                    @data[k] = v
                @commit()
                callBack(true) if Ext.isFunction(callBack)
            failure: =>
                callBack(false) if Ext.isFunction(callBack)

在JS中(未测试):

Ext.define("Ext.ux.data.Model", {
    override: "Ext.data.Model",
    reload: function(callBack) {
        var me = this;
        return Ext.getClass(this).load(this.getId(), {
            success: function(r, o) {
                var k;
                for (k in r.data) {
                    me.data[k] = r.data[k];
                }
                me.commit();
                if (Ext.isFunction(callBack)) {
                    callBack(true);
                }
            },
            failure: function() {
                if (Ext.isFunction(callBack)) {
                    callBack(false);
                }
            }
        });
    }
});

我在Ext.data.Model上创建了一个覆盖,以添加一个可用于更新现有记录(模型实例)数据的附加方法。

Ext.define('Ext.overrides.data.Model', {
    override: 'Ext.data.Model',
    /**
     * Refresh the data of a record from the server
     */
    reloadData: function(cb) {
         var me = this;
         var id = me.getId();
         Ext.ModelManager.getModel(me.modelName).load(id, {
            callback: function(record, operation, success) {
                if (!success) {
                    Ext.Error.raise('Problem reloading data from server in record');
                }
                if (!record) {
                    Ext.Error.raise('No record from server to reload data from');
                }
                //change the data of the record without triggering anything
                Ext.apply(me.data, record.getData());
                //call a final callback if it was supplied
                if (cb) {
                    cb.apply(me, arguments);
                }
            }
        });
        return me;
     }
});

这就是你可以使用它的方法。它实际上很简单:

myRecord.reloadData(function(record, operation, success) {
    //Done updating the data in myRecord
});

在内部,它使用关联模型上的load方法来创建新记录。该新记录基于与调用reloadData方法的原始记录相同的id。在回调中,新记录的数据将应用于原始记录的数据。没有触发任何事件,这可能是您想要的。

这是分机4.2.1。这个解决方案可能会出现几十种情况,但我们总是可以改进,不是吗。

更新:这个解决方案基本上实现了与@Drasill的解决方案相同的解决方案。哦,好吧。。。不过,这个已经过测试了。