0

data.js現在、Grid アプリ テンプレートによって提供されるデータを非同期的に読み込んでいます。StorageFile クラスの非同期の性質により、グローバルな WinJS 名前空間が設定される前にgroupedItems.js(「ハブ」ページ) がハンドラーで呼び出さ_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 の関数に移動できないので、レイアウトを初期化する前に WinJS 名前空間で が初期化されるdata.jsまでアプリケーションを待機させるにはどうすればよいですか?Data

4

1 に答える 1

0

進行中の 2 つの非同期操作 (データの読み込みとページの読み込み) と、両方の非同期操作が完了した (ページが読み込まれ、データが利用可能になった) 後にのみ実行する必要がある 1 つのアクション (グリッドの初期化) があります。これを解決するには、どのようなアーキテクチャ アプローチを採用するかによって、さまざまなアプローチがあります。

  1. 力ずくの方法は、ドキュメントの準備ができていてデータがロードされているかどうかを確認する新しい関数を作成し、そうであれば を呼び出すこと_initializeLayout()です。次に、その関数を両方の場所 (ドキュメントが読み込まれた場所とデータが利用可能な場所) で呼び出すと、両方の条件が満たされた場合にのみ実行されます。Dataグローバル項目の存在とそれに関連するプロパティをチェックすることで、データがロードされているかどうかを判断できるようです。

  2. アーキテクチャ的に少しクリーンな、より複雑なソリューションがあります。たとえば、doc ready ハンドラーで、データがまだ利用可能かどうかを確認できます。そうであれば、レイアウトを初期化するだけです。データが利用可能になったときにコールバックが呼び出され、レイアウトを初期化できるように通知をインストールしない場合。データ読み込みコードに現在通知スキームがない場合は、データが読み込まれたときに呼び出されるクライアントが使用できる通知スキームを作成します。これには、データをロードするコードがグリッドについて何も知る必要がないという点で、最初の方法よりも利点があります。グリッドはデータについて知る必要があります。グリッドはデータを必要とするため、これは理にかなっています。

  3. これを行うために約束/完了システムを使用する方法は確かにありますが、私はそれを使用してそれを行う良い方法を提案するほど個人的に十分に精通していません.

于 2013-03-13T08:44:40.353 に答える