app.onactivated不会触发,具体取决于app.start()的位置

时间:2012-12-13 20:05:54

标签: windows-8 winjs

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

我试图了解生命周期中的所有内容,所以我不清楚为什么下面的第一个例子有效,但第二个没有。我正在做的就是更新页面标题,当我在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 个答案:

答案 0 :(得分:4)

start功能的文档有点误导。

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

重要的一点是,在您致电start之前,排队才会开始。在排队开始之前WebUIApplication发出的任何事件都将永远丢失。

这是您通过延迟拨打start来创建的情况:activated事件是在WebUIApplication队列设置之前由WinJS.Application发送的。 activated永远不会收到WinJS.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();
})();