1

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

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

在此处输入图像描述

例如,当标题或标签更改时,右侧的文本(生成的推文消息)会在键入时更新。为此,我注册了一个keyUp设置Session.set("current_article", $.extend(Session.get("current_article"), {tweet: someMagicTweetGeneration()})). 您可能已经注意到我使用 Session 变量的方式会导致重新渲染整个模板。

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

4

2 回答 2

2

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

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

所以现在当你改变article.title这个隔离块内的位时,会改变,周围的一切都不会改变。

您确实必须重新渲染 DOM 中发生变化的位,因此我们的想法是仅重新渲染需要重绘的位。

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

例如,在上面你可能在 中使用了很多东西{{article}},但你只使用{{article.title}}了那段代码,所以最好只使用模板。如果您知道要使用所有这些,那么您不妨使用嵌套对象。

于 2013-09-04T17:46:42.787 回答
1

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

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

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

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

于 2013-09-04T19:12:53.913 回答