Windows 8 在循环中调用WinJS IListDataAdapter

Windows 8 在循环中调用WinJS IListDataAdapter,windows-8,winjs,Windows 8,Winjs,我已经使用VirtualizedDataSource实现了IListDataAdapter,它从异步WinRT源填充对象。它几乎像预期的那样工作。我设置了一个从数据源递增加载的ListView。似乎itemsFromIndex方法在某种无限循环中被WinJS库反复调用 我简化了数据适配器,使其包含对填充列表的引用,以确保异步调用不会产生问题。当我水平滚动时,列表视图试图填充自己,但很多时候,它只是在内部进入无限循环 当我滚动列表视图时,它开始加载项目模板。它不能约束他们。我怎么知道它在一个循环中

我已经使用VirtualizedDataSource实现了IListDataAdapter,它从异步WinRT源填充对象。它几乎像预期的那样工作。我设置了一个从数据源递增加载的ListView。似乎itemsFromIndex方法在某种无限循环中被WinJS库反复调用

我简化了数据适配器,使其包含对填充列表的引用,以确保异步调用不会产生问题。当我水平滚动时,列表视图试图填充自己,但很多时候,它只是在内部进入无限循环

当我滚动列表视图时,它开始加载项目模板。它不能约束他们。我怎么知道它在一个循环中?断点和下面的console.log。它一直在疯狂地使用我的处理器。有人知道这里发生了什么吗

这是我的itemsFromIndex的代码。没什么特别的

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]
};