2014-03-04 73 views
0

在WinJS中,獲取ListView對象中項目數的唯一方法是使用方法getCount()爲什麼IListDataAdapter.getCount異步

但是這種方法是異步的。

這使得在for循環中使用它非常困難,例如當需要遍歷列表項時。

var listView = document.getElementById("listView").winControl; 
listView.itemDataSource.getCount().done(
    function (numItems) { 
     for (var i = 0; i < numItems; i++) { 
      //do your stuff here 
     } 
    }); 

如果我把這個在我的代碼任何部分我不能回到我的環從任何函數讀取的值,因爲利用getCount()返回一個承諾,讓我的函數也返回一個承諾等在...

所以我的問題是爲什麼?調用方法時,列表中的項目數量是否已知?

+2

listView可以綁定到StorageDataSource,並不少見。它迭代文件,速度足夠慢,需要異步。不,listView不會爲你完成這項工作,它避免了在視圖中只有少數幾個實際可見的情況下,記住成千上萬個文件所需的內存。很難看出問題的答案如何有所幫助。 –

+1

它很有用,因爲它不是立即清楚的是listview實際上只加載了內存中的可見項。 –

回答

1

ListView的數據契約允許異步數據源,我們有一個基類VirtualizedDataSource,你可以使用花哨的場景這樣的。如果您使用的是WinJS.Binding.List作爲您的數據源API實際上是同步的,你應該能夠說:

listView.itemDataSource.list.length 

但是,如果你正在寫通用代碼,與ListView的和沒有按交易不知道它會是什麼樣的數據源

3

你試過joining promises?如果您擔心的是通過按索引選擇每個項目然後對它們執行一些工作來迭代ListView中的所有項目,則可以使用WinJS.Promise.join創建一個包含所有操作結果的單個承諾。

例如:

var listView = document.getElementById("listView").winControl; 
listView.itemDataSource.getCount().then(
    function (numItems) { 
     var joinedPromises = []; 
     for (var i = 0; i < numItems; i++) { 
      joinedPromises.push(listView.itemDataSource.itemsFromIndex(i, 0, 0)); 
     } 
     return WinJS.Promises.join(joinedPromises); 
    }).done(
    function (results) { 
     // Operate on each item in the ListView's data source. 
    }, 
    function (err) { 
     // Handle any errors from the joined promises. 
    });