9

我有一个困扰我的问题。

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

我可以重新加载商店,但我只想检查一个特定的记录......所以我想我会去获取数据,建立另一条记录并替换商店中的现有记录,但我真的想知道最好的方法去做这个

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

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

谢谢你。

4

4 回答 4

5

ExtJS 4.1

我有一个类似的问题,作为一个实验尝试

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

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

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

我知道您说您没有使用 REST 代理,但这可能会帮助其他发现此帖子的人搜索您的主题名称等搜索词(这就是我到达这里的方式!)

因此,看起来“addRecords”意味着添加更新。

仅供参考,默里

于 2013-04-18T11:17:44.473 回答
4

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

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

保存后,您可能还应该在网格视图上调用刷新,这将重绘来自保存事件的更改。如果您担心性能,您还可以在商店中的确切记录上使用 refreshNode(请参阅网格视图文档)。

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

于 2011-06-03T13:08:55.930 回答
1

对于 ExtJS 4.1,这里有一个覆盖:

在咖啡脚本中:

# 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);
                }
            }
        });
    }
});
于 2013-01-23T10:59:33.903 回答
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。在回调中,新记录的数据应用于原始记录的数据。没有触发事件,这可能是您想要的。

这是分机 4.2.1。这个解决方案可能有几十个场景被破坏,但我们总是可以改进,不是吗。

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

于 2016-02-18T20:22:08.193 回答