会话对象是一个全局(singletone)注册表。有很多原因没有使用它们(只是谷歌为“为什么(单线程,全局对象,注册表模式)(是|是)不好”
在流星的情况有点特别。非常简单的方法来反应性地存储变量,这就是为什么你不在应用程序中使用全局变量的唯一原因。假设你不需要反应性 - 你会把它变成一个全局变量吗?可能不是。重新使用会话从代码中的一个地方获取变量的内容到另一个地方(在两个其他方式中不相关的对象之间是不可见的“神秘桥梁”),这既不是“流星”方式也没有干净的使用(指上面的搜索结果),这只是一个容易的,肮脏的可能性
清洁方法
如何避免这种情况:创建您自己的反应变量。流星提供了所有它的手段,它真的很容易做到:
(function() {
var currentProject;
var currentProjectDependency = new Deps.Dependency();
Meteor.Router.add({'/projects/:id', function(id) {
currentProject = id;
currentProjectDependency.changed();
return 'project';
}
Template.project.project = function() {
Deps.depend(currentProjectDependency);
return Projects.findOne(currentProject);
}
}());
现在我们不使用会话来存储信息,但有反应也是如此。此外,我们不污染全球空间。请注意,最新发布的Meteor会自动添加闭包。
这个例子可以扩展到更复杂的用例,其反应性跨越几个对象(例如控制器)。看看我的navigation package是一个更复杂的例子。
理由使用会话
那么,为什么会话存在呢?两个原因:
为了简单起见。流星努力成为初学者的友好。由于对反应性和体系结构的理解,我描述的方法有点复杂。大多数项目都足够小而不关心这一点。
但是更大的项目可以使用会话:跨页面重新加载存储信息时,您无法恢复其他项目。在我看来,这是使用会话的唯一理由。会话内容在代码推送页面重新加载时“持久”。如果这认为不好呢?不是,因为只有一个对象依赖于会话的内容。请注意,这不适用于您的示例,因为您可以轻松恢复信息。
来源
2013-03-27 12:03:16
Fge
我相信这是它的设计。 [Session](http://docs.meteor.com/#session)允许模板被反应,所以如果您的URL上的ID发生更改,您的模板将会更新。 – pstuart2 2013-03-26 01:50:24
我同意这是流星的方式。拥抱它:) – adrianj98 2013-03-26 03:24:45
大多数人认为这是不稳定的,但@ adrianj98说,这是流星的方式。起初我甚至觉得不舒服。但后来我发现它是行得通的! – Prashant 2013-03-26 07:23:20