3

我正在使用流星路由器编写一个简单的流星应用程序。我的问题是路由器知道请求参数,但模板不知道。所以我总结了这样的约定:

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

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

有没有更简洁的方法来获取模板级别的当前请求 ID 参数,以避免所有这些会话变量?

4

1 回答 1

5

会话对象是一个全局(单音)注册表。有很多不使用它们的原因(只是谷歌“为什么(单调,全局对象,注册表模式)(是|是)不好”。

在 Meteor 中,情况有点特殊。Session 对象是一种非常简单的反应式存储变量的方法。这是您不在应用程序中使用全局变量的唯一原因。假设您不需要反应性-您会将其设为全局变量吗?可能不是。

您错误地使用会话将变量的内容从代码中的一个位置获取到另一个位置(作为其他两种不相关对象之间的内容的隐形“神秘桥梁”)。这既不是“流星”的方式,也不是干净的使用方式(参考上面的搜索结果)。这只是一个简单而肮脏的可能性。

更清洁的方法

如何避免这种情况:创建自己的反应变量。Meteor 为它提供了所有的手段,而且这样做真的很容易:

(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 会自动添加闭包。

这个例子可以扩展到更复杂的用例,反应性跨越多个对象(例如控制器)。看看我的导航包作为更复杂的例子。

使用会话的原因

那么为什么 Session 存在呢?两个原因:

为简单起见。Meteor 努力对初学者友好。由于对反应性和架构的理解,我描述的方法有点复杂。大多数项目都小到不关心这一点。

但更大的项目也可以使用 session: 来存储跨页面重新加载的信息,否则您无法恢复。在我看来,这是使用 session 的唯一原因。会话内容在来自代码推送的页面重新加载中“持久化”。如果这算坏事呢?不,因为只有一个对象依赖于会话的内容。请注意,这不适用于您的示例,因为您可以轻松地恢复信息。

于 2013-03-27T12:03:16.143 回答