2012-12-13 78 views
1

我對於WinJS.Application.start()函數的理解是,它允許WinJS排隊某些正常的頁面初始化事件,讓您有機會首先在您的default.js中設置其他數據文件。通過調用default.js末尾的start()函數,WinJS會爲您排除所有排隊事件(例如activated事件)。app.onactivated取決於app.start()的位置

我想了解哪裏一切都適合生命週期,所以我不清楚爲什麼下面的第一個例子工作,但第二個沒有。我做的是更新頁面標題,當我一個5秒的延遲之後調用app.start()預期不工作:

首先,這裏default.html

<html> 
<head> 
    <script references...> 
</head> 
<body> 
    <h1 id="pageTitle">Page of coolness...</h1> 
</body> 
</html> 

而這裏的第一default.js例子(按預期工作):

(function() { 

    var app = WinJS.Application; 

    app.onactivated = function() { 
      document.getElementById("pageTitle").innerText = "Rock it!"; 
    }; 

    // This code *does* fire the onactivated event: 
    // The page displays "Rock it!" in the page title 
    app.start(); 

})(); 

這裏是第二default.js例子(如預期不工作):

(function() { 

    var app = WinJS.Application; 

    app.onactivated = function() { 
      document.getElementById("pageTitle").innerText = "Rock it!"; 
    }; 

    // This code *doesn't* fire the onactivated event: 
    // It initially displays "Page of coolness..." in the page title. 
    // After 5 seconds, it adds "Gettin' there...Almost made it..." 
    // to the the page title, but "Rock it!" never gets displayed 
    WinJS.Promise.timeout(5000).then(function() { 
     document.getElementById("pageTitle").innerText += "Gettin' there..."; 
     app.start(); 
     document.getElementById("pageTitle").innerText += "Almost made it..."; 
    }); 
})(); 

爲什麼在5秒後調用app.start()導致activated事件不火?

+1

不是一個答案,但裝載的確實火。您可以在調試器中遍歷base.js,並且會看到執行的差異序列。這幾乎就好像激活的事件處理程序被「連接太遲」一樣,所以當它觸發時,它還沒有被連接,並且是空的,但是不能解釋爲什麼或者如果這是合適的行爲。 –

+0

@Jim _「就好像被激活的事件處理程序被連接'太晚'一樣,所以當它被觸發時,它還沒有被連接並且是空的......」_...事實證明,這正是發生了,它看起來像是按照設計的方式(儘管我不知道爲什麼) – RSW

回答

4

start函數的文檔有點誤導。

當您致電start時,WinJS.Application開始排隊和派遣事件,包括由Windows.UI.WebUI.WebUIApplication發出的事件。其中一個事件是activated,這是導致您的處理函數被調用的原因。

重要的一點是,排隊不會開始,直到您撥打start。排隊開始之前由WebUIApplication發出的任何事件都將永久丟失。

這是你已經通過延遲您的來電start創建的情況:activated事件被WebUIApplicationWinJS.Application隊列已經建立之前發送。 activated事件永遠不會被WinJS.Application收到,所以你的處理函數永遠不會被調用。

我知道你只是想弄清楚生命週期,但是沒有理由推遲你在現實生活中對start函數的調用。讓你嘗試在代碼中創建效果的唯一方法是把承諾的onactivated處理函數裏面,像這樣:

(function() { 

    var app = WinJS.Application; 

    app.onactivated = function() { 
     document.getElementById("pageTitle").innerText += "Gettin' there..."; 

     WinJS.Promise.timeout(5000).then(function() { 
      document.getElementById("pageTitle").innerText = "Rock it!"; 
     }); 
     document.getElementById("pageTitle").innerText += "Almost made it..."; 

    }; 

    app.start(); 
})(); 
+0

我終於決定在'base.js'裏面冒險,我一直在猶豫。它看起來像'WinJS。應用程序隊列在調用'start()'之前就已經建立了,但是由於'start()'是'Windows.UI.WebUI.WebUIApplication.activated'事件的事件處理程序被附加的地方,並且這個處理程序是什麼排隊'WinJS.Application.activated'事件,然後延遲調用'start()'防止'Windows.UI.WebUI.WebUIApplication.activated'事件被處理(因爲它的處理程序在事件觸發後被連接 - 在default.js結束後)。謝謝 – RSW

+0

「有沒有理由拖延你的電話在現實生活中的啓動功能」 - 不同意 – deepelement

相關問題