【发布时间】:2014-06-22 11:14:13
【问题描述】:
我有一个由多个页面和一个主页组成的 web 应用程序。在 Meteor 中开发这个 web 应用程序时,我将页面分离到模板中。 webapp 会在一段时间内显示不同的页面,这意味着页面 A 应该是 60 秒,然后继续页面 B 可能是 75 秒,依此类推。
在meteor中,我构建了一个由页眉和页脚和一个可变模板组成的主页。所以基本上主页是这样的:
<template name='main'>
{{>header}}
{{>templateHolder}}
{{>footer}}
</template>
并且页面被翻译成模板,即templateA等。这些模板将根据会话对象的更新替换templateHolder,这也基于将使用@执行的一些时间(以秒为单位) 987654325@JS函数。
一切正常,但是我注意到每个页面的时间都乱套了。当我单独测试template 时,它们工作正常。我怀疑 setTimeout 的异步调用在某种程度上相互冲突。
这里是周期性改变模板的JS代码。
Template.main.templateHolder = function(){
var appIndex = Session.get('currentAppIndex');
switch(appIndex){
case 'A':
return Template['templateA'];
} //....and so on... with other templates
}
Template.main.created = function() {
//Query each pages display time and load it into sessions
// etc...........
Session.set('currentAppIndex',0); //Initialize the first page
setTimeout(nextPage,0);
}
function nextPage() {
//Bunch of line of codes that retrieve time param from settings and calculate
//Also some simple alogrithm to get next templates.. etc
//Update the session index object so that it reactively updates the templateHolder
setTimeout(nextPage,currPageDisplayTime); //currPageDisplayTime is the pages time of display in milliseconds.
}
我不确定我的方法是否正确,但它设法显示模板并更改它们。唯一担心的是时间不能正常工作。动态更改模板的最佳方法是什么?这在未来容易出现任何错误吗?
【问题讨论】:
-
setTimeout的第二个参数是在执行作为第一个参数传递的函数之前要等待多少毫秒。这里有一个名为currPage的变量似乎很可疑。尝试使用1000来查看页面是否每秒都在变化。 -
基于上述注释,不会立即调用时间为 0ms 的 setTimeout()。它将被放置在一个队列中,以便在任何挂起的事件处理程序完成后调用。此外,Meteor 更喜欢使用 Meteor.setTimeout() 而不是 setTimeout()。
-
@JeremyS.:
Meteor.setTimeout()在客户端也很重要吗?在服务器端这是必要的,因为里面的代码会自动绑定到环境中,但是在浏览器中是什么必要的呢? -
@PeppeL-G 是的,很抱歉第二个错误
setTimeout。 currPage 应该是显示的页面时间(例如 60 秒等)但是是的,我确实将它乘以 1000,因为我知道它以毫秒为单位。 -
@HubertOG 这是一个很好的问题,也许对于整个 SO 社区来说都是一个问题。我在所有地方都使用了 Meteor.setTimeout(),我认为这是一种最佳实践,基于这样的线程 groups.google.com/forum/#!topic/meteor-talk/V8_R8ZUCcdo 这向我建议,从 setTimeout() 中的客户端调用的某些服务器端方法可能无法正确运行.我可能是错的。但是因为 Meteor.setTimeout() 在任何地方都可以使用,所以我在任何地方都使用它作为一种习惯。在这种情况下应该无关紧要,因为我们只是显示模板。很想听听补充信息。
标签: javascript meteor