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

时间:2011-06-03 01:47:22

标签: javascript extjs extjs4 extjs-mvc

我遇到了一个让我烦恼的问题。

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

我可以重新加载商店,但我只想要检查一个特定的记录......所以我想我会去获取数据,建立另一条记录并替换商店中的现有记录,但我真的想知道最佳方式来执行此操作

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

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

谢谢。

4 个答案:

答案 0 :(得分:5)

ExtJS 4.1

我遇到了类似的问题并尝试过实验

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

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

没有首先删除现有记录(作为实验)并且更新与服务器中的新数据具有相同ID的现有记录(通过模型 - > REST代理)。完善!

我知道你说你没有使用REST代理,但是这可能会帮助那些发现这篇文章的人搜索你的主题名称之类的搜索词(这就是我到达这里的方式!)

所以,看起来'addRecords'意味着添加更新。

FYI, 默里

答案 1 :(得分:4)

执行此类操作的最佳方法是在打开窗口的事件中重新加载记录。因此,您可以将网格存储中的记录加载到窗口中的表单中,您可以使用模型从id加载。

Item.load(id, { success: function(r) { form.loadRecord(r); } });

保存后,您可能还应该在网格视图上调用refresh,这将从save事件重绘更改。如果您关注性能,还可以在商店中的确切记录上使用refreshNode(see grid view documentation)。

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

答案 2 :(得分:1)

使用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);
                }
            }
        });
    }
});

答案 3 :(得分:0)

我在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
});

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

这是Ext 4.2.1。可能存在数十种情况,这种解决方案会中断,但我们总是可以改进而不是我们。

更新:此解决方案基本上与@Drasill实现相同。哦,好吧......这个测试了。