2009-06-23 71 views
6

我正在使用API​​爲here的雅虎DataTable如何在創建後更改YUI數據網格上的數據源

我一旦渲染了一次網格就無法改變數據。我正在使用jQuery通過AJAX獲取數據,或者從客戶端數據島獲取數據,並且需要將其放回網格中。

DataTable API中沒有setDataSource方法,並且更改'dataSource.liveData'不會更新網格。

// does not work 
dataTable.dataSource.liveData = [ {name:"cat"}, {name:"dog"}, {name:"mouse"}; 

我基於我的代碼的例子是basic LocalDataSource example

如何在不必完全重新創建表的情況下更新數據源。我不想使用進行異步調用的YUI數據源。我需要知道我可以如何「手動」進行此操作。

+0

西蒙,檢查了這一點。這是否成功? – 2009-07-06 10:23:53

+0

@keith我的老闆總是改變我的優先事項。我還沒有嘗試。會讓你知道 – 2009-07-06 17:15:49

回答

5

你在正確的軌道上,你只是忘了告訴數據源發送數據到數據表。您使用的是LocalDataSource,並希望與什麼是數據源中替換表中的數據假設,更換livedata後,你只是做

dataTable.getDataSource().sendRequest(null, 
    {success: dataTable.onDataReturnInitializeTable}, 
    dataTable); 

另見API參考DataTable其他onDataReturnXXX方法。您可以添加新數據而不是替換等。

0

如何更新數據源而不必完全重新創建表格?

您的意思是不使用「新」聲明?如果是這樣,我自己也不必這樣做,但我經常使用YUI。我注意到有一個deleteRows方法可以用來刪除所有的行,0到表的長度,然後在這種情況下使用addRows,它採用像你的字面數組和索引0。

你試過這個嗎?

編輯:看看this example。你想做的事絕對可以做到。該表使用setInterval方法以設定的時間間隔在本地進行更新(並非令人意外)。看看setInterval的作用,你可以看到它調用了數據源實例上的makeConnection。該方法聽起來像是在進行遠程通話,但並不一定。

讓我們來看看示例中的幾條線。

// Set up polling 
    var myCallback = { 
     success: myDataTable.onDataReturnInitializeTable, 
     failure: function() { 
      YAHOO.log("Polling failure", "error"); 
     }, 
     scope: myDataTable 
    } 
    myDataSource.setInterval(5000, null, myCallback) 

最後一行可以被稱爲一次(或根據您的需要的需求),而不是在一個時間間隔通過改寫這樣的:

myDataSource.makeConnection(null, myCallBack) 

它調用onDataReturnInitializeTable方法 - 我猜你可以直接打電話,這會更有意義。

無論如何,只要沿着這個例子,拿出你不需要的部分。最終它看起來像onDataReturnInitializeTable方法是關鍵。

希望有所幫助。

+0

是的,我的意思是避免做'新YAHOO.datatable()'..我沒有嘗試手動添加和刪除行。我只是認爲真的應該是一種更新整個表格的方法。當YUI AJAX調用返回時,它不可能刪除所有行並重新添加它們。那會很瘋狂。 – 2009-06-25 21:05:11

+0

@交易看起來很有希望。將檢查出來。是的,肯定會需要能夠立即運行而不是從計時器 – 2009-06-26 02:59:37

3

我只是想補充說,如果傳遞給參數屬性中的getState()調用,則可以保留分頁。

dataTable.getDataSource().sendRequest(null, 
    { 
     success: dataTable.onDataReturnInitializeTable, 
     argument: dataTable.getState()  
    } 
); 
0

其實,我所做的,以得到它的工作是下面的代碼兩行(和我是從阿賈克斯那麼一點點比OP不同返回)...

dataTable.dataSource.liveData = eval(o.responseText); 
dataTable.load({}); 

因爲如果您閱讀datatable.load()所做的是每個人都打算打電話。

相關問題