构建会话变量以最小化模板重新呈现

时间:2013-09-04 16:58:25

标签: meteor

我目前正在开发我的第一个Meteor项目,随着代码基础的增长,我不确定正确使用会话变量/反应式编程方法。例如,让我们看一下用于编辑博客文章的表单。在编辑之前,我使用Session.set("current_article", Articles.findOne(id))来设置当前文章。打开文章表单时,使用<input type="text" name="title" value="{{article.title}}">正确填充所有内容。

但表单比仅显示标题要复杂得多:

enter image description here

E.g。当标题或标签发生变化时,右侧的文本(生成的推文消息)会在输入时更新。为此,我注册了一个设置keyUp的{​​{1}}监听器。您可能已经注意到我使用Session变量的方式会导致重新呈现整个模板。

所以我的问题是:将更复杂的对象(如文章)存储到会话变量中是否有意义?这样保存表单非常简单,但显然会导致其他问题。我应该将Session.set("current_article", $.extend(Session.get("current_article"), {tweet: someMagicTweetGeneration()}))分成Session.get("current_article")Session.get("current_article.title"),......吗?还有其他最佳做法吗?

2 个答案:

答案 0 :(得分:2)

您可以使用{{#isolate}}..{{/isolate}}块,以便只重新渲染模板的某些部分而不是整个部分,例如:

{{#isolate}}
    <input type="text" name="title" value="{{article.title}}">
{{/isolate}}

所以现在当你更改article.title时,只会更改此隔离块内的位,并且周围的所有内容都不会受到影响。

您必须重新渲染更改的DOM位,因此我们的想法是仅重新渲染需要重绘的位。

对于Session变量,尝试以一种方式存储它们,如果将变量发送到DOM,则避免发送一个大对象,而只发送模板所需的部分。

如上所述,您可能在{{article}}中使用了很多内容,但只在代码中使用{{article.title}},因此最好只使用模板。如果你知道你将使用所有这些,那么你也可以使用嵌套对象。

答案 1 :(得分:1)

我想打赌流星越来越好,所以我们不必跳过那种箍。我想你已经知道http://docs.meteor.com/#template_preserve

我建议您尝试将数据拆分为会话,主要和侧边栏中的两个不同结构。让每个模板只对一个或另一个做出反应。这甚至可能是您的mongo集合的合理架构。

我读了一些关于优化的建议,建议你在会话中存储id,而不是整个对象,然后只为该集合找到findOne。

这是一个假设的问题,还是你有困扰的症状?