2012-06-29 50 views
2

我正在使用single-page navigation model構建Metro應用程序。在我的一個頁面上,我啓動了一個獲取某些信息的異步​​ajax請求。當請求返回時,我想將接收到的信息插入到顯示的頁面中。當異步回調返回時,我如何知道我仍然在正確的頁面上?

例如:

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

但我怎麼知道用戶沒有在此期間從頁面導航離開?嘗試在不同頁面上插入文本沒有意義,因此如何確保請求啓動時加載的頁面仍處於活動狀態?

回答

0

我找不到這樣做的官方方式,所以我實施了一種解決方法。

WinJS.Navigation提供在導航上觸發的事件。我用navigating event構建一個簡單的類,保存的頁面訪問量軌跡:

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; 
     }); 
    } 
}; 
2

您可以比較當前WinJS.Navigation.location頁面URI來檢查,如果你仍然在頁面上。您可以使用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; 
     }); 
    } 
}; 
相關問題