【问题标题】:Avoid use of Session.set避免使用 Session.set
【发布时间】:2013-12-10 02:12:59
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我相信它就是这样设计的。 Session 允许模板是响应式的,因此如果您在 url 上的 id 更改,您的模板将更新。
  • 我同意这是流星的方式。拥抱它:)
  • 大多数人认为这是不稳定的,但正如@adrianj98 所说,这是 Meteor 方式。一开始连我自己都觉得不舒服。但后来我发现它确实有效!
  • Session 没什么问题,很干净。不要被它的名字所迷惑,它不是某种 cookie 或其他东西,它只是一个反应性的普通 hashmap。

标签: meteor


【解决方案1】:

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

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

此示例可以扩展到更复杂的用例,其反应性跨越多个对象(例如控制器)。看看我的navigation package 作为更复杂的例子。

使用会话的原因

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-18
    • 2014-10-17
    • 2022-11-15
    • 2023-01-15
    • 2019-01-15
    • 2017-11-07
    • 2017-09-12
    • 1970-01-01
    相关资源
    最近更新 更多