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

Javascript ExtJS 4-更新/刷新单个记录,javascript,extjs,extjs4,extjs-mvc,Javascript,Extjs,Extjs4,Extjs Mvc,我有个困扰我的问题 我有一个网格,当我点击一个项目时,我想打开一个窗口来编辑该项目。相当标准的东西。问题是,我想确保记录是最新的,因为使用该程序的其他人可能已经更改了它,甚至删除了它 我可以重新加载存储,但我只想检查一条特定记录。。。所以我想我应该去获取数据,建立另一个记录,并替换商店中现有的记录,但我真的想知道做这件事的最佳方法 请记住,RESTful代理不是我的选项,即使我不知道在这种情况下更新操作是否有效(服务器->客户端) 编辑: 这可能有助于某人: 我所做的只是将数据和原始对象从新记录

我有个困扰我的问题

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

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

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

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


谢谢。

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

Item.load(id, { success: function(r) { form.loadRecord(r); } });
保存后,您可能还应该在网格视图上调用refresh,这将重新绘制save事件中的更改。如果您关心性能,还可以对存储中的确切记录使用refreshNode()


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

对于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中(未测试):

ExtJS4.1

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

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

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

I没有首先删除现有记录(作为实验),它使用服务器上的新数据(通过model-->REST代理)更新了具有相同id的现有记录。太好了

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

所以,看起来“addRecords”的意思是添加或更新

仅供参考,
Murray

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

这就是你可以使用它的方式。其实很简单:

myRecord.reloadData(function(record, operation, success) {
    //Done updating the data in myRecord
});
在内部,它使用关联模型上的load方法来创建新记录。该新记录基于与调用reloadData方法的原始记录相同的id。在回调中,新记录的数据应用于原始记录的数据。没有触发任何事件,这可能是您想要的

这是Ext 4.2.1。这个解决方案可能有几十种情况,但我们总是可以改进,不是吗


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

加载函数(在模型上)会生成另一条记录(这就是为什么a在我单击该项时会发布这个问题:D),我已经得到了该记录,我只想重新加载它,而不是生成另一条记录,或者如果是,如何干净地替换旧记录。谢谢Simon。如果你想检查服务器的新鲜度,那么你必须加载一个新版本。如果您想只使用网格的备份存储,而不是使用独立模型,那么您必须从存储中删除记录,然后使用一个仅获取相关记录的url在网格存储上加载({add:true})。因此,无法重新加载它。。。好的,谢谢你,我会接受你的回答,因为它实际上在“刷新网格”问题上帮助了我。我担心当我删除并添加(或相反)有问题的记录时,它会弹弹或其他东西。谢谢。这个解决方案糟透了,因为你正在内存中创建另一个对象-如果你更新新加载的项目,存储中的项目将不同步。嗨,Simon,事实上我很想看到你上面提供的链接,但它不起作用。你能发布新的链接吗?不幸的是,这重置了滚动位置,并在我的网格末尾添加了更新的记录。我使用了这里找到的脚本的修改版本:修改私有
数据
属性不是一个好主意。最好改用
set
方法。@AlexeySolonets set会将记录标记为“脏”,这里不是这种情况。当然我们应该使用
suspendEvents
commit
resumeEvents
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
});