【问题标题】:How to improve data handling with meteor如何使用流星改进数据处理
【发布时间】:2015-04-15 21:54:19
【问题描述】:

仍在使用我的流星应用程序,我现在想了解如何改进我在 minimongo 中的数据处理。

习惯了 SQL / PHP,我想知道如何从我的 minimongo 集合中查找()一个对象,并使用助手访问它的每个属性,而不必每次都重新访问该集合。

直到现在,我所做的都是这样的:

Template.profile.helpers({
  name: function(e, tmpl){
    return Meteor.users.FindOne({_id: Meteor.userId()}.profile.name;
  },
  phone: function(e, tmpl){
    return Meteor.users.FindOne({_id: Meteor.userId()}.profile.phone;
  }

[...] });

但是它变得越来越无聊,我想必须有一种更有效的方法来处理它,我可以只加载一次我的整个用户信息,然后使用带有一个参数的助手显示,以显示数据,例如那:{{数据名称}},{{数据电话}}

只有一个这样的助手:

Template.profile.helpers({
  data: function(aString){
    if (aString == "phone)
      return [...].phone;
    }
  }
[...]
});

当然,我可以使用会话值,但我不确定它是否具有相关性。

另一件事:如何结束 Meteor 会话?因为使用 PHP,会话在浏览器关闭时结束,并且 cookie 会保留给定的持续时间,但使用流星会话,我不必日复一日地重新连接,我的日志似乎会保留。

有人会指导我完成这项工作或给我一些好习惯/提示吗?我仍在阅读文档,但它非常庞大:S

谢谢!

【问题讨论】:

    标签: javascript meteor minimongo


    【解决方案1】:

    这里需要注意的一点——当你在客户端调用Mongo.Collection.find() 时实际上并没有向服务器发送请求——这是由客户端上的 miniMongo 实例处理的,所以它并不是真的那么低效。此外,在这种特殊情况下,当前用户始终可以作为Meteor.user() 使用——无需使用Meteor.users.find({_id: Meteor.userId()});(有关更多信息,请参阅docs

    但是,如果您真的想缓存该值,您可以执行以下操作:

    // JS
    var data; // scoped so it's available to the whole file
    
    Template.profile.onCreated({
        data = Meteor.users.findOne({_id: Meteor.userId()}); // above scope makes this new definition available to the whole file
    });
    

    然后,要使用字符串参数执行您所描述的操作,您可以执行类似...

    Template.profile.helpers({
        data: function(aString) { 
          if (data) { return data[aString]; }
        }
    });
    

    也许更好的选择是给模板发送一个数据上下文——在你的 HTML 文件中是这样的:

    {{> profile currentUser}} <!-- currentUser returns Meteor.user() -->
    

    您的助手可以直接使用this

    Template.profile.helpers({
      data: function(aString) { 
        return this[aString];
      }
    });
    

    如果您将其用于路由,您还可以传递数据上下文 through IronRouter

    对于 Meteor 会话,模型与 PHP 的模型不同。在 PHP 中,您将会话信息存储在服务器上,每次访问服务器时,浏览器(或更一般的客户端)都会发送会话 ID,以便它可以查找与您的会话相关的任何内容(参见 this question可能更好的解释)。 Meteor 会跟踪连接到它的客户端,因此只要您的浏览器打开,会话就会保持打开状态。如果您需要操作 Meteor 用户会话,请查看 this question

    【讨论】:

    • 非常感谢! :) 的确,这似乎是一种更好的方法,即使它有轻微的改进。我会这样做!
    【解决方案2】:

    我建议在 Atmosphere 上找到收集助手包。这将使您能够在模板中编写 currentUser.name ,它会自动返回用户名帮助函数返回。

    这样工作没有问题。函数是否被多次调用并不重要。它不会损害您的应用程序性能。

    PHP 和流星会话是不同的。只要浏览器窗口保持打开或刷新页面,流星会话就会持续。你是对的,流星会议不是解决你问题的方法。

    【讨论】:

    • 非常感谢您的帮助和解释 :) 然后我将不得不使用真正的 mongodb,因为我的应用程序可以接收成千上万的用户,但我没有考虑过还没有。
    • 这也不是问题。您只向客户端发布特定用户。一般来说,它只会是一个用户(登录用户)。客户端 mini mongodb 将只有一个用户,因此您不需要缓存任何内容。您永远不应该将数千个项目发送到任何单个页面。
    • 是的,但是服务器端,我需要使用和设置一个mongodb,不是吗?
    • 是的。但是服务器端没有模板(除非你安装了特殊的包,但不要)。我认为您需要阅读一些有关 Meteor 的教程。发现流星是一本好书。数据库存在于客户端和服务器上。您向客户端发布最少的信息,而不是 1k 用户。客户端获取这些数据并使用您编写的模板和服务器发布的文档构建页面。
    猜你喜欢
    • 2013-09-27
    • 1970-01-01
    • 2015-11-18
    • 2019-02-21
    • 2016-07-25
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多