2010-04-23 46 views
2

我正在使用dojo datagrid來顯示我的數據。當最終用戶編輯單元格值時,應該使用ajax調用在服務器中更新它(當焦點離開單元格時)。如何處理dojo datagrid單元格更新,以便我可以將它們自動發回服務器?

否則,我應該有一個編輯&更新/取消按鈕爲每一行來處理相同的功能。 但我不知道如何在網格中放置編輯&更新按鈕並捕獲它們的事件。

默認情況下,dojo僅更新本地存儲值(客戶端)。 如何將更新後的單元格值保存到服務器中?

我們需要編寫任何覆蓋方法嗎?

我是新來的道場。任何詳細的解釋或示例代碼將不勝感激。

任何人都可以借錢解決這個問題嗎?

謝謝

問候, 拉吉

回答

4

爲了能夠推送更新服務器端,您必須覆蓋_saveCustom()_saveEverything()。這是我用來保存更新的一段代碼(稍微清理一下)。

請注意,下面的代碼依賴於專用的_getModifiedItems(),因爲DataGrid接受內聯版本。如果您知道修改項目的列表(因爲該版本是在彈出窗口中完成的,並且將項目關鍵字保存在某處),則修改後的項目會更簡單。

module.submitUpdates = function() { 
    var store = <from a variable local to the module> 
    if (store.isDirty() confirm("Updates to be persisted. Continue?")) { 
     store._saveCustom = function(saveCompleteCallback, saveFailedCallback) { 
      var modifiedItem = _getModifiedItems(store)[0]; 
      dojo.xhrPost({ 
       headers: { "content-type": "application/json; charset=utf-8" }, 
       content: dojo.toJson(modifiedItem), 
       handleAs: "json", 
       load: function(response) { 
        if (response !== null && response.success) { 
         saveCompleteCallback(); 
        } 
        else { 
         saveFailedCallback(response); 
        } 
       }, 
       error: saveFailedCallback, 
       url: "/API/<Object>" 
      }); 
     }; 
     store.save({ 
      onComplete : function() { 
       module.loadCachingRuleList(); 
      }, 
      onError : function(errorData, request) { 
       _reportUpdateFailure(errorData, errMsg); 
      } 
     }); 
    } 
}; 

下面是我用它來獲取所有更新的項目時,用戶將失去一個更新的DataGrid中的代碼(因爲他離開頁面或者是因爲他想刷新格的內容)。

請注意,以下代碼使用了Dojo 1.3。我還沒有檢查Dojo 1.4是否更容易...我希望dojo.Stateful將在Dojo 1.5中引入,這將簡化它,否則我們將不得不等待Dojo 1。6)

var _getModifiedItems = function(store) { 
    var modifiedItems = []; 
    if (store !== null && store._pending !== null) { 
     if (store._pending._modifiedItems !== null) { 
      for (var modifiedItemKey in store._pending._modifiedItems) { 
       if (store._itemsByIdentity) { 
        modifiedItems.push(store._itemsByIdentity[modifiedItemKey]); 
       } 
       else { 
        modifiedItems.push(store._arrayOfAllItems[modifiedItemKey]); 
       } 
      } 
     } 
     if (store._pending._newItems !== null) { 
      for (var modifiedItemKey in store._pending._newItems) { 
       if (store._itemsByIdentity) { 
        modifiedItems.push(store._itemsByIdentity[modifiedItemKey]); 
       } 
       else { 
        modifiedItems.push(store._arrayOfAllItems[modifiedItemKey]); 
       } 
      } 
     } 
    } 
    return modifiedItems; 
}; 

var _getDeletedItems = function(store) { 
    var deletedItems = []; 
    if (store !== null && store._pending !== null && store._pending._deletedItems !== null) { 
     for (var deletedItemKey in store._pending._deletedItems) { 
      if (store._itemsByIdentity) { 
       deletedItems.push(store._itemsByIdentity[deletedItemKey]); 
      } 
      else { 
       deletedItems.push(store._arrayOfAllItems[deletedItemKey]); 
      } 
     } 
    } 
    return deletedItems; 
}; 

我希望這有助於 A +,大教堂

+0

在這種情況下,「模塊」是什麼? – 2011-04-28 23:24:58

+0

是什麼是模塊對象? – Sandeep 2012-08-16 10:08:36

1

這不是一個很詳細的說明,但肯​​定的,你應該重寫處理用戶的數據條目,我沒有看到這個事件的方法。因此,基本上創建一個從數據網格繼承的新類,在源代碼中找到處理編輯的方法並覆蓋它,以便爲它提供額外的操作以將其發回服務器。你也想在該方法中調用datagrid的默認動作。

這裏的一些信息(你可能已經知道的):

http://docs.dojocampus.org/dojox/grid/DataGrid#editing-data

我以前就延長Dojo的默認組件,它並不難。我發現檢查Dojo源代碼總是很好,並且在升級Dojo時要小心以確保新版本不會破壞現有功能。

1

爲了避免黑客入侵你的道場庫,只需切換到YUI2數據表;它的單元格編輯器接收發送編輯內容到你的服務器 這是從文檔

asyncSubmitter

功能

實施者定義功能,可以輸入值提交到服務器的描述asyncsubmitter功能。該函數必須接受參數fnCallback和oNewValue。提交完成後,函數還必須調用fnCallback(bSuccess,oNewValue)來完成CellEditor中的保存例程。這個函數也可以用來執行額外的驗證或輸入值操作。 YUI2DataTable

相關問題