2013-03-26 71 views
3

我正在使用流星路由器编写一个简单的流星应用程序。我的问题是路由器知道请求参数,但模板不是。所以我绕了公约,如本:避免使用Session.set

Meteor.Router.add({'/projects/:id', function(id) { 
    Session.set('currentProjectId', id); 
    return 'project'; 
} 

Template.project.project = function() { 
    return Projects.findOne(Session.get('currentProjectId')); 
} 

是否有一个更清洁的方式来获得在模板级别当前请求ID PARAM,以避免所有这些会话变量?

+0

我相信这是它的设计。 [Session](http://docs.meteor.com/#session)允许模板被反应,所以如果您的URL上的ID发生更改,您的模板将会更新。 – pstuart2 2013-03-26 01:50:24

+1

我同意这是流星的方式。拥抱它:) – adrianj98 2013-03-26 03:24:45

+0

大多数人认为这是不稳定的,但@ adrianj98说,这是流星的方式。起初我甚至觉得不舒服。但后来我发现它是行得通的! – Prashant 2013-03-26 07:23:20

回答

5

会话对象是一个全局(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是一个更复杂的例子。

理由使用会话

那么,为什么会话存在呢?两个原因:

为了简单起见。流星努力成为初学者的友好。由于对反应性和体系结构的理解,我描述的方法有点复杂。大多数项目都足够小而不关心这一点。

但是更大的项目可以使用会话:跨页面重新加载存储信息时,您无法恢复其他项目。在我看来,这是使用会话的唯一理由。会话内容在代码推送页面重新加载时“持久”。如果这认为不好呢?不是,因为只有一个对象依赖于会话的内容。请注意,这不适用于您的示例,因为您可以轻松恢复信息。

+0

这是一个有用的,写得很好的答案。谢谢。 +投票 – jdc 2013-06-18 22:38:59