1

我对该WinJS.Application.start()函数的理解是,它允许 WinJS 将某些正常的页面初始化事件排队,让您有机会首先在default.js文件中设置其他数据。通过调用start()末尾的函数default.js,WinJS 会为您触发所有排队的事件(例如activated事件)。

我试图了解一切都适合生命周期的位置,所以我不清楚为什么以下示例中的第一个有效,而第二个无效。我所做的只是更新页面标题,当我app.start()在延迟 5 秒后调用时,它无法按预期工作:

首先,这里是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...";
    });
})();

为什么app.start()在 5 秒延迟后调用会导致activated事件不触发?

4

1 回答 1

4

start函数的文档有点误导。

当您调用 时startWinJS.Application开始排队和分派事件,包括由 发出的事件Windows.UI.WebUI.WebUIApplication。其中一个事件是activated,这会导致您的处理程序函数被调用。

重要的一点是,直到您调用start. WebUIApplication在排队开始之前发出的任何事件都将永远丢失。

这是您通过延迟调用来创建的情况start:在队列设置之前activated发送事件。该事件永远不会被接收,因此您的处理程序函数永远不会被调用。WebUIApplicationWinJS.ApplicationactivatedWinJS.Application

我知道您只是想弄清楚生命周期,但没有理由延迟您start在现实生活中对该函数的调用。获得您试图在代码中创建的效果的唯一方法是将 Promise 放在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();
})();
于 2012-12-15T22:27:16.870 回答