2014-03-04 49 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. 
    });