Templates 加入流星的正确方式是什么?
我有两个集合,一个集合有一个用户id,它引用用户集合的_id字段 我想查询所有用户一次,并使用下划线indexBy函数按_id对数组进行索引,然后在表中显示用户名,而不是用户id 大概是这样的: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
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);
}
});