1

この機能についての私の理解では、WinJS.Application.start()WinJS が特定の通常のページ初期化イベントをキューに入れ、他のデータを最初にファイルに設定する機会を与えることができdefault.jsます。start()の最後で関数を呼び出すことによりdefault.js、WinJS はキューに入れられたすべてのイベント (イベントなどactivated) を起動します。

すべてがライフサイクルのどこに当てはまるかを理解しようとしているので、次の例の最初の例が機能するのに 2 番目の例が機能しない理由がわかりません。私がしているのは、ページ タイトルを更新することだけですが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();

})();

2 番目の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。これらのイベントの 1 つが ですactivated。これにより、ハンドラー関数が呼び出されます。

重要な点は、 を呼び出すまでキューイングが開始されないことですstart。キューイングが開始される前にによって発行されたイベントは、WebUIApplication永久に失われます。

これは、 への呼び出しを遅らせることによって作成した状況ですstartactivatedイベントは、キューが設定されるWebUIApplication前にによって送信されます。イベントは受信されないWinJS.Applicationため、ハンドラー関数は呼び出されません。activatedWinJS.Application

ライフサイクルを理解しようとしているだけだとは思いますがstart、実際に関数の呼び出しを遅らせる理由はありません。コードで作成しようとしている効果を得る唯一の方法は、次のonactivatedように Promise をハンドラー関数内に配置することです。

(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 に答える