Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates 加入流星的正确方式是什么?_Templates_Meteor - Fatal编程技术网

Templates 加入流星的正确方式是什么?

Templates 加入流星的正确方式是什么?,templates,meteor,Templates,Meteor,我有两个集合,一个集合有一个用户id,它引用用户集合的_id字段 我想查询所有用户一次,并使用下划线indexBy函数按_id对数组进行索引,然后在表中显示用户名,而不是用户id 大概是这样的: Template.posts.users_by_id = function() { _.indexBy(Users.find().fetch(), '_id'); } 在模板中: {{ users_by_id[user_id].name }} 但是,表中的每一行都会调用users_by_id

我有两个集合,一个集合有一个用户id,它引用用户集合的_id字段

我想查询所有用户一次,并使用下划线indexBy函数按_id对数组进行索引,然后在表中显示用户名,而不是用户id

大概是这样的:

Template.posts.users_by_id = function() {
    _.indexBy(Users.find().fetch(), '_id');
}
在模板中:

{{ users_by_id[user_id].name }}
但是,表中的每一行都会调用users_by_id,而不是一次。我已尝试将u.indexBy的结果按_id存储在Template.posts.user_中,但随后得到未捕获的引用错误:未定义用户


此外,我似乎无法访问名称键,只显示了[object object]。

看起来您正在尝试优化性能。。。但你还在使用自动发布


如果是我,我会使用您想要的用户ID订阅Users集合,并让服务器将该集合发布回客户端。由于这些用户随后有效地存储在本地内存中,因此调用Users.finduser_id.fetch.name应该花费很少的时间。而且它也是被动的,所以当你的收藏更新时,你的界面也会更新。

如果你想在字典中存储用户,你需要一本字典

var users = {};
// var usersDep = new Deps.Dependency();

Template.posts.created = function() {
  users = _.indexBy(Users.find().fetch(), '_id');
  // usersDep.changed();
};

Template.posts.users_by_id = function() {
  // usersDep.depend();
  return users;
};
我在评论中添加了依赖关系管理。根据您初始化字典的位置,可能需要也可能不需要,我现在不确定

请注意,您可以通过仅返回用户而不是整个字典来简化帮助器:

Template.posts.user_by_id = function() {
  return users[this.user_id];
};
考虑到您订阅的所有用户对象都已经在非常有效的Minimongo中,我建议使用直接方法:

Template.posts.user_name = function() {
  return Users.findOne(this.user_id).name;
};

一方面,你有一个Minimongo查找而不是普通的对象查找,但另一方面,你不需要字典的额外内存,你不需要时间来填充和索引它,你也不会遇到反应性问题。如果此处的优化对应用程序至关重要,请尝试这两种方法并比较它们的渲染时间。

这是Meteor的典型连接模式。使用查询执行联接

<template name="users">
  {{#each users}}
    {{> user}}
  {{/each}}
</template>

<template name="user">
  {{#with user}}
    {{name}}
  {{/with}}
</template>

Template.users.helpers({
  users: function() {
    SomeCollection.find();
  }
});

Template.user.helpers({
  user: function() {
    return Users.findOne(this.user_id);
  }
});