2011-06-03 91 views
8

我有一个问题困扰着我。ExtJS 4 - 更新/刷新单个记录

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

我可以重新加载商店,但我只想要检查一个特定的记录...所以我觉得我只是去获取数据,建立另一个记录,并替换现有的商店,但我真的很想知道最好的办法要做到这一点

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

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

谢谢。

回答

4

做这种事情的最好方法是在打开窗口的事件中重新加载记录。因此,例如,如果要将网格商店中的记录加载到窗口内的窗体中,可以使用模型从ID加载。

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

一旦保存,您应该也可以调用网格视图上的刷新,这将刷新保存事件中的更改。如果您担心性能问题,也可以在商店的确切记录上使用refreshNode(see grid view documentation)。

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

+0

加载函数(在模型上)构建另一个记录(这就是为什么发布此问题:D)当我dblclick项目我已经获得记录,我只想重新加载它,而不是另建一个,或者如果所以,如何干净地更换旧的。谢谢西蒙。 – 2011-06-03 14:47:46

+0

如果你想检查服务器的新鲜度,那么你将不得不加载一个新版本。如果您想单独使用网格的后台存储,而不是使用独立模型,则必须从商店中删除记录,然后使用只抓取网址的网址在网店上加载({add:true})相关记录。 – 2011-06-03 14:57:32

+0

因此,没有办法重新加载它......好吧,谢谢,我会接受你的回答,因为它实际上帮助我解决了“刷新网格”问题。我担心它会弹出或什么时候我删除,然后添加(或反之亦然)有问题的记录。谢谢。 – 2011-06-03 15:40:03

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); 
       } 
      } 
     }); 
    } 
}); 
+0

这不是修改私有'data'属性的好主意。改用'set'方法代替。 – 2013-10-15 11:31:50

+0

@AlexeySolonets设置将记录标记为“脏”,但这里并不是这种情况。 – Drasill 2013-10-15 17:04:48

+1

当然我们应该使用'suspendEvents','commit'和'resumeEvents' – 2013-10-16 10:16:02

5

ExtJS的4.1

我一个类似的问题,并作为试验

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

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

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

我知道你说你不使用REST代理,但是这可能帮助其他人谁发现这个职位搜索喜欢你的主题名称搜索词(这是我来到这里!)

因此,它看起来像'addRecords'意味着添加更新。

FYI, 默里

+2

不幸的是,这会重置滚动位置并在我的网格末尾添加更新的记录。我使用了在此处找到的脚本的修改版本:http://vadimpopa.com/reload-a-single-record-and-refresh-its-extjs-grid-row/ – ToniTornado 2013-06-23 21:51:43

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相同的功能。哦,好吧......这个虽然经过测试。