目前我通过网格应用程序模板提供的异步加载数据。由于StorageFile类的异步特性,因此在设置全局WinJS名称空间中的Data
之前,groupedItems.js
(“集线器”页面)在ready
处理程序中调用_initializeLayout
的问题存在。initializeLayout和异步加载
在:
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()
功能,我怎么做应用程序要等到Data
在初始化布局之前在WinJS名称空间中初始化?
你可以扩展一下“创建通知”方案来执行回调函数,或者提供一些这方面的例子吗? – 2013-03-13 20:58:11
在'data.js'中,可以添加一个名为'notifyWhenDataReady(fn)'的函数,该函数将回调函数作为参数。然后,当data.js中的数据准备就绪时,它会调用该回调函数(如果已注册的话)。在groupedItems中,它会检查数据是否已经可用。如果没有,它会安装回调函数并推迟调用'_initializeLayout()'直到调用回调函数。这样,'data.js'不必具体了解'_initializeLayout()'或'groupedItems.js'的任何内容,但它仍然可以在需要时向其他模块提供正确的信息。 – jfriend00 2013-03-13 21:11:36
我遇到的唯一问题是'noficyWhenDataReady(fn)'的作用域限于'data.js',所以我该如何传递回调函数参数fn? – 2013-03-13 23:45:38