Windows 8 根据app.start()的位置,未激活app.on

Windows 8 根据app.start()的位置,未激活app.on,windows-8,winjs,Windows 8,Winjs,我对WinJS.Application.start()函数的理解是,它允许WinJS将某些正常页面初始化事件排队,以便您有机会首先在default.js文件中设置其他数据。通过调用default.js末尾的start()函数,WinJS然后为您触发所有排队的事件(例如激活的事件) 我试图理解生命周期中的每件事都适合哪一个,所以我不清楚为什么下面的第一个例子有效,而第二个则无效。我所做的只是更新页面标题,当我在5秒延迟后调用app.start()时,页面标题无法按预期工作: 首先,这里是defau

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

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

首先,这里是
default.html

<html>
<head>
    <script references...>
</head>
<body>
    <h1 id="pageTitle">Page of coolness...</h1>
</body>
</html>
下面是第二个
default.js
示例(它没有按预期工作):


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

有关
start
函数的文档有点误导

调用
start
时,
WinJS.Application
开始排队和分派事件,包括由
Windows.UI.WebUI.WebUIApplication
发出的事件。其中一个事件是激活的
,这将导致调用处理程序函数

重要的一点是,在调用
start
之前,队列不会开始。在队列开始之前,
WebUIApplication
发出的任何事件都将永远丢失

这是您通过延迟对
start
的调用而造成的情况:在设置
WinJS.Application
队列之前,
activated
事件由
WebUIApplication
发送。
WinJS.Application
从未收到
activated
事件,因此您的处理程序函数从未被调用


我知道您只是想了解生命周期,但在现实生活中没有理由延迟对
start
函数的调用。要想在代码中产生效果,唯一的方法是将承诺放在激活的处理函数中,如下所示:

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

start
函数的文档有点误导

调用
start
时,
WinJS.Application
开始排队和分派事件,包括由
Windows.UI.WebUI.WebUIApplication
发出的事件。其中一个事件是激活的
,这将导致调用处理程序函数

重要的一点是,在调用
start
之前,队列不会开始。在队列开始之前,
WebUIApplication
发出的任何事件都将永远丢失

这是您通过延迟对
start
的调用而造成的情况:在设置
WinJS.Application
队列之前,
activated
事件由
WebUIApplication
发送。
WinJS.Application
从未收到
activated
事件,因此您的处理程序函数从未被调用


我知道您只是想了解生命周期,但在现实生活中没有理由延迟对
start
函数的调用。要想在代码中产生效果,唯一的方法是将承诺放在激活的处理函数中,如下所示:

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

不是答案,但超负荷会开火。您可以在调试器中遍历base.js,您将看到执行了一个不同的序列。这几乎就像激活的事件处理程序“太晚”被附加一样,所以当它触发时,它还没有被附加并且为null,但无法解释为什么或者这是否是合适的行为。@Jim“这几乎就像激活的事件处理程序“太晚”被附加一样,所以当它触发时,它还没有被附加并且为null…”…事实证明,这正是正在发生的事情,而且它看起来是这样设计的(尽管我不知道为什么)不是答案,但重载确实会开火。您可以在调试器中遍历base.js,您将看到执行了一个不同的序列。这几乎就像激活的事件处理程序“太晚”被附加一样,所以当它触发时,它还没有被附加并且为null,但无法解释为什么或者这是否是合适的行为。@Jim“这几乎就像激活的事件处理程序“太晚”被附加一样,所以当它触发时,它还没有被附加并且为null…”…事实证明,这正是正在发生的事情,从设计上看(尽管我不知道为什么),我最终决定冒险进入
base.js
,这是我一直在犹豫的事情。看起来
WinJS.Application
队列确实是在调用
start()
之前设置的,但是由于
start()
Windows.UI.WebUI.WebUI.activated
事件的事件处理程序的附加位置,因此该处理程序是对
WinJS.Application.activated
事件进行排队的,然后延迟对
start()
的调用会阻止处理
Windows.UI.WebUI.WebUIApplication.activated
事件(因为它的处理程序在事件触发后被附加,这就发生在
default.js
完成之后)。谢谢“在现实生活中,没有理由推迟对start函数的调用”-我最终决定冒险进入
base.js
,我一直在犹豫。看起来
WinJS.Application
队列确实是在调用
start()
之前设置的,但是由于
start()
Windows.UI.WebUI.WebUI.activated
事件的事件处理程序的附加位置,因此该处理程序是对
WinJS.Application.activated
事件进行排队的,然后延迟调用
start()
pr
(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();
})();