2

シングルページ ナビゲーション モデルを使用して Metro アプリを構築しています。私のページの 1 つで、情報を取得する非同期 ajax リクエストを開始します。リクエストが返ってきたら、受け取った情報を表示しているページに挿入したい。

例えば:

WinJS.UI.Pages.define("/showstuff.html", {
    processed: function (element, options) {
        WinJS.xhr(...).done(function (result) {
            element.querySelector('#target').innerText = result.responseText;
        });
    }
};

しかし、その間にユーザーがページから移動していないことをどのように知ることができますか? 別のページにテキストを挿入しようとしても意味がありません。リクエストが開始されたときにロードしていたページがまだアクティブであることを確認するにはどうすればよいですか?

4

2 に答える 2

2

ページの URI を現在の URI と比較して、WinJS.Navigation.locationまだそのページにいるかどうかを確認できます。Windows.Foundation.Uriこれを行うには、ページの URI からパスを取得するために使用できます。

WinJS.UI.Pages.define("/showstuff.html", {
    processed: function (element, options) {
        var page = this;

        WinJS.xhr(...).done(function (result) {
            if (new Windows.Foundation.Uri(page.uri).path !== WinJS.Navigation.location)
                return;

            element.querySelector('#target').innerText = result.responseText;
        });
    }
};
于 2012-11-01T04:34:48.103 に答える
0

これを行う公式の方法が見つからなかったので、回避策を実装しました。

WinJS.Navigationナビゲーションで発生するイベントを提供します。navigatingこのイベントを使用して、ページ ビューを追跡する単純なクラスを作成しました。

var PageViewManager = WinJS.Class.define(
    function () {
        this.current = 0;
        WinJS.Navigation.addEventListener('navigating',
                this._handleNavigating.bind(this));
    }, {
        _handleNavigating: function (eventInfo) {
            this.current++;
        }
    });

Application.pageViews = new PageViewManager();

このクラスは、ユーザーが新しいナビゲーションを開始するたびにカウンターをインクリメントします。

そのカウンターを使用して、Ajax リクエストはナビゲーションが発生したかどうかを確認し、それに応じて対応できます。

WinJS.UI.Pages.define("/showstuff.html", {
    processed: function (element, options) {
        var pageview = Application.pageViews.current;

        WinJS.xhr(...).done(function (result) {
            if (Application.pageViews.current != pageview)
                return;

            element.querySelector('#target').innerText = result.responseText;
        });
    }
};
于 2012-06-30T00:18:38.247 に答える