我目前正在开发我的第一个Meteor项目,随着代码基础的增长,我不确定正确使用会话变量/反应式编程方法。例如,让我们看一下用于编辑博客文章的表单。在编辑之前,我使用Session.set("current_article", Articles.findOne(id))
来设置当前文章。打开文章表单时,使用<input type="text" name="title" value="{{article.title}}">
正确填充所有内容。
但表单比仅显示标题要复杂得多:
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")
,......吗?还有其他最佳做法吗?
答案 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。
这是一个假设的问题,还是你有困扰的症状?