2012-12-13 30 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

相关问题