1

ページのready関数でナビゲーションを実行しようとするたびに、アプリケーションがクラッシュします。

具体的には、次のWinJS.Navigation.navigate("/pages/login/login.html", {});行で失敗します。

// This function is called whenever a user navigates to this page. It
// populates the page elements with the app's data.
ready: function (element, options) {            

    var listView = element.querySelector(".groupeditemslist").winControl;
    listView.groupHeaderTemplate = element.querySelector(".headertemplate");
    listView.itemTemplate = element.querySelector(".itemtemplate");
    listView.oniteminvoked = this._itemInvoked.bind(this);

    // Set up a keyboard shortcut (ctrl + alt + g) to navigate to the
    // current group when not in snapped mode.
    listView.addEventListener("keydown", function (e) {
        if (appView.value !== appViewState.snapped && e.ctrlKey && e.keyCode === WinJS.Utilities.Key.g && e.altKey) {
            var data = listView.itemDataSource.list.getAt(listView.currentItem.index);
            this.navigateToGroup(data.group.key);
            e.preventDefault();
            e.stopImmediatePropagation();
        }
    }.bind(this), true);

    this._initializeLayout(listView, appView.value);
    listView.element.focus();

    initialize();
}

function initialize() {
    // Check if user is logged in
    if (is_logged_in !== true) {
        WinJS.Navigation.navigate("/pages/login/login.html", {});
    }
    else {
        // TODO: Replace the data with your real data.
        // You can add data from asynchronous sources whenever it becomes available.
        generateSampleData().forEach(function (item) {
            list.push(item);
        });
    }
}

なぜこれが起こるのか誰もが知っていますか?

4

2 に答える 2

2

ここにはいくつかのルートがあります。

  1. 未処理の例外をキャッチして無視する
  2. エラー状態を設定しないようにコードを構成する

エラーを無視するには、未処理の例外を処理できる WinJS.Application.onerror ハンドラーをセットアップできます。このソリューションのガイドとなるフォーラムの投稿は次のとおりです

一般に、例外をすべて一緒に回避する方がよいと思います。そのために - ここで起こっていることは、一度に 1 つのナビゲーション イベント (promise) しか発生できないということです。groupedItems への移動に使用されるナビゲーション promise は、ready 関数内にいるときでも実行されています。initialize を呼び出すと、WinJS.Navigation.navigate("/pages/login/login.html", {}); が呼び出されます。これを見て、最初に現在実行中のナビゲーションの約束をキャンセルしようとします。これにより、表示されている例外が発生します。

代わりに、window.setImmediate関数を使用して、現在のスクリプト ブロックが終了した後に実行されるように initialize() の呼び出しをセットアップできます。これを行うには、initialize() の呼び出しを次のように置き換えます。

window.setImmediate(this.initialize.bind(this));
于 2012-08-23T00:00:10.730 に答える
1

Release Preview から来た後に RTM バージョンでコードを実行している場合、これで問題が解決されるはずです。

function initialize() {
    // Check if user is logged in
    if (is_logged_in !== true) {
        WinJS.Navigation.navigate("/pages/login/login.html", {});
    }
    else {
        // TODO: Replace the data with your real data.
        // You can add data from asynchronous sources whenever it becomes available.
        generateSampleData().forEach(function (item) {
            list.push(item);
        });
    }
}

var markSupportedForProcessing = WinJS.Utilities.markSupportedForProcessing;
var requireSupportedForProcessing = WinJS.Utilities.requireSupportedForProcessing;

markSupportedForProcessing(initialize);
requireSupportedForProcessing(initialize);

上記の実際の目的とその理由について詳しく説明している移行ドキュメントを参照する必要があります。

于 2012-08-19T15:03:03.667 に答える