2011-06-03 57 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相同的功能。哦,好吧......這個雖然經過測試。