目前我通過網格應用程序模板提供的異步加載數據。由於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