如何用meteor改进数据处理

时间:2015-04-15 13:01:23

标签: javascript meteor minimongo

仍然在我的流星应用程序上,我现在想如何从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

谢谢!

2 个答案:

答案 0 :(得分:0)

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

这样的工作没有问题。如果多次调用该函数并不重要。它不会伤害您的应用程序性能。

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

答案 1 :(得分:0)

有一点需要注意 - 当你在客户端上调用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];
  }
});

如果您将数据上下文用于路由,也可以传递数据上下文{。}}。

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