0

目前,我正在通过data.jsGrid 应用程序模板提供的异步加载数据。由于 StorageFile 类的异步特性,在设置全局 WinJS 命名空间之前groupedItems.js(“Hub”页面)_initializeLayout在处理程序中调用的位置存在问题。readyData

data.js

fileNames.forEach(function (val, index, arr) {
    var uri = new Windows.Foundation.Uri('ms-appx:///data/' + val + '.geojson');

    Windows.Storage.StorageFile.getFileFromApplicationUriAsync(uri).then(function (file) {

        Windows.Storage.FileIO.readTextAsync(file).then(function (contents) {

            // ... read, parse, and organize the data ...

            // Put the data into the global namespace
            WinJS.Namespace.define("Data", {
                items: groupedItems,
                groups: groupedItems.groups,
                getItemReference: getItemReference,
                getItemsFromGroup: getItemsFromGroup,
                resolveGroupReference: resolveGroupReference,
                resolveItemReference: resolveItemReference
            });
        });
    });
}

groupedItems.js

 // ...

 // This function updates the ListView with new layouts
    _initializeLayout: function (listView, viewState) {
        /// <param name="listView" value="WinJS.UI.ListView.prototype" />

        if (viewState === appViewState.snapped) {
            listView.itemDataSource = Data.groups.dataSource;
            listView.groupDataSource = null;
            listView.layout = new ui.ListLayout();
        } else {
            listView.itemDataSource = Data.items.dataSource;
            listView.groupDataSource = Data.groups.dataSource;
            listView.layout = new ui.GridLayout({ groupHeaderPosition: "top" });
        }
    },

 // ....

看到我无法将此代码从该文件移出到done()Promise in 的函数中data.js,如何让应用程序等到Data在初始化布局之前在 WinJS 命名空间中初始化?

4

1 回答 1

0

您有两个正在进行的异步操作(加载数据和加载页面)和一个操作(初始化网格),只有在两个异步操作完成(加载页面,数据可用)后才需要执行。有很多方法可以解决这个问题,具体取决于您要采用的架构方法。

  1. 蛮力方法是您创建一个新函数来检查文档是否已准备好和数据是否已加载,如果是,则调用_initializeLayout(). 然后,您在两个地方(加载文档的地方和数据可用的地方)调用该函数,并且只有在两个条件都满足时才会执行。看来您可以通过检查全局Data项及其相关属性的存在来判断数据是否已加载。

  2. 还有更多涉及的解决方案在架构上更简洁。例如,在您的文档就绪处理程序中,您可以检查数据是否可用。如果是,您只需初始化布局。如果不是您安装通知,以便当数据可用时,您的回调将被调用,然后您可以初始化布局。如果数据加载代码当前没有通知方案,那么您创建一个可供任何希望在数据加载后调用的客户端使用的方案。与第一种方法相比,这具有优势,因为数据加载代码不必了解有关网格的任何信息。网格确实必须了解数据——这是有道理的,因为网格需要数据。

  3. 当然也有一些方法可以使用 promise/done 系统来做到这一点,尽管我个人对它不够熟悉,无法建议使用它的好方法。

于 2013-03-13T08:44:40.353 回答