0

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

谢谢 !

4

2 回答 2

0

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

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

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

于 2015-04-15T13:51:24.647 回答
0

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

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

// 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];
  }
});

如果您将IronRouter用于路由,您还可以通过它传递数据上下文。

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

于 2015-04-15T13:54:19.230 回答