Windows 8 在循环中调用WinJS IListDataAdapter
我已经使用VirtualizedDataSource实现了IListDataAdapter,它从异步WinRT源填充对象。它几乎像预期的那样工作。我设置了一个从数据源递增加载的ListView。似乎itemsFromIndex方法在某种无限循环中被WinJS库反复调用 我简化了数据适配器,使其包含对填充列表的引用,以确保异步调用不会产生问题。当我水平滚动时,列表视图试图填充自己,但很多时候,它只是在内部进入无限循环 当我滚动列表视图时,它开始加载项目模板。它不能约束他们。我怎么知道它在一个循环中?断点和下面的console.log。它一直在疯狂地使用我的处理器。有人知道这里发生了什么吗 这是我的itemsFromIndex的代码。没什么特别的Windows 8 在循环中调用WinJS IListDataAdapter,windows-8,winjs,Windows 8,Winjs,我已经使用VirtualizedDataSource实现了IListDataAdapter,它从异步WinRT源填充对象。它几乎像预期的那样工作。我设置了一个从数据源递增加载的ListView。似乎itemsFromIndex方法在某种无限循环中被WinJS库反复调用 我简化了数据适配器,使其包含对填充列表的引用,以确保异步调用不会产生问题。当我水平滚动时,列表视图试图填充自己,但很多时候,它只是在内部进入无限循环 当我滚动列表视图时,它开始加载项目模板。它不能约束他们。我怎么知道它在一个循环中
itemsFromIndex: function (requestIndex, countBefore, countAfter) {
var length = this._isupportincrementalloadcollection.size;
if (requestIndex >= length) {
return WinJS.Promise.wrapError(new WinJS.ErrorFromName(WinJS.UI.FetchError.doesNotExist));
}
var start = Math.max(requestIndex - countBefore, 0);
var end = Math.min(requestIndex + countAfter, length - 1);
var items = [];
for (var i = start; i <= end; i++) {
var item = this._itemFromIndex(i);
items.push(item);
}
console.log("returning");
return WinJS.Promise.wrap({
absoluteIndex: requestIndex,
atEnd: end === length - 1,
atStart: start === 0,
items: items,
offset: requestIndex - start,
totalCount: length
});
}
原来适配器很好,问题是钥匙。IListDataAdapter希望返回的数据是一个对象,其中包含该对象和对象本身的键。密钥必须是唯一的字符串。如果密钥不是字符串,则会发生不好的事情。如果钥匙不是唯一的,坏事就会发生。在上面的代码中,您看不到密钥的使用位置,但我使用了一个密钥映射函数。结果表明适配器非常好,问题在于密钥。IListDataAdapter希望返回的数据是一个对象,其中包含该对象和对象本身的键。密钥必须是唯一的字符串。如果密钥不是字符串,则会发生不好的事情。如果钥匙不是唯一的,坏事就会发生。在上面的代码中,您看不到该键的使用位置,但我使用了一个键映射函数。我本想将此作为注释添加到原始答案中,但它太多,无法正确格式化。无论如何,我今天遇到了这个问题,我想澄清一下: IIListDataAdapter.itemsFromIndex必须返回一个承诺,该承诺本身会返回一个IFetchResult: IFetchResult.items必须是IItem对象的数组: key属性不需要是唯一的,它只需要是项索引的字符串化版本,即.42.toString MSDN教程并没有很好地解释必要的成分,但我发现他们的示例源中的场景4确实做到了这一点
试一试:我本想在原始答案中添加此作为注释,但它太多,格式不正确。无论如何,我今天遇到了这个问题,我想澄清一下: IIListDataAdapter.itemsFromIndex必须返回一个承诺,该承诺本身会返回一个IFetchResult: IFetchResult.items必须是IItem对象的数组: key属性不需要是唯一的,它只需要是项索引的字符串化版本,即.42.toString MSDN教程并没有很好地解释必要的成分,但我发现他们的示例源中的场景4确实做到了这一点
试一试:我的问题最终导致fetch result对象缺少totalCount属性。MSDN教程没有提到:谢谢!!我的问题最终导致fetch结果对象上缺少totalCount属性。MSDN教程没有提到:谢谢!!伟大的谢谢你自己发布答案!我已经花了1小时来调试这个。太好了!谢谢你自己发布答案!我已经花了1小时调试这个。
loadingBehavior: 'incremental',
pagesToLoad: 4,
automaticallyLoadPages: true,
pagesToLoadThreshold: 1,
IFetchResult = {
items: [Array],
offset: [int],
totalCount: [int]
};
IItem = {
key: [string],
data: [Object]
};