【问题标题】:Meteor Rendering Template DynamicallyMeteor 动态渲染模板
【发布时间】: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


【解决方案1】:

我找到了这种错误行为的原因。我该如何解决它们?

  1. 每当模板中发生超时时,我都会输入 JS alert
  2. 另外,每当会话对象更新时,alert

模板渲染的流程应该是这样的template A (60 secs) --&gt; template B (75secs)--&gt; template A(这是一个循环)。我注意到在显示template B 期间,我放入template Aalert 触发了!这意味着即使一次只显示一个模板,创建的模板在幕后继续健康地生活。它仍然继续该过程,无论它被指定做什么。

这让我意识到,如果两个模板同时存在,我就不能使用相同的会话对象,因为它们都会更新相同的内容。结果我标准化了跨模板使用会话对象;例如,我使用Session.set('itemIndex',index) 来遍历每个模板中的集合,但由于模板不小心使用了同一个对象,因此它们都同时更新了数据。

所以 JS setTimeout 按预期工作。问题在于共享会话对象。

TL;DR 模板在不显示/更改时不会被破坏。这可以通过手动销毁或使用不同的对象来避免。

P/S:仍在寻找创建后如何销毁模板。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-12
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    相关资源
    最近更新 更多