2

我正在使用单页导航模型构建 Metro 应用程序。在我的一个页面上,我启动了一个异步 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 与当前进行比较,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 回答