Meteorjs - 迭代用户数据的正常方式
Meteorjs - normal way to iterate user data
我正在使用 MeteorJs 开发一个系统,我需要获取在我的 MongoDB 中注册的用户的所有电子邮件和个人资料。这是我的 publish.js
if (Meteor.isServer) {
Meteor.publish('Userlist', function() {
return Meteor.users.find({}, {fields: {emails: 1, profile: 1}});
});
}
这是我在模板级别订阅用户数据的地方res_user.js
Template.reg_user.onCreated(function() {
this.subscribe('Userlist');
});
Template.reg_user.helpers({
userku: function() {
let user = Meteor.users.find();
return user;
},
});
这是我的html
{{#each userku}}
<ul>
<li>{{emails.address}} </li>
<li>{{profile.name}} </li>
</li>
{{/each}}
当我试图在我的 html 中重复它时,它不显示任何电子邮件,只显示个人资料名称,看完这个 tutorial
我发现需要一些自定义助手来接收电子邮件,所以知道我添加了新助手
Template.reg_user.helpers({
// same code here
getEmail: function(){
return this.emails[0].address;
}
});
并在我的 html 中调用这个助手而不是普通的
{{#each userku}}
<ul>
<li>{{getEmail}} </li>
<li>{{profile.name}} </li>
</li>
{{/each}}
为什么我不能用正常的方式取email.address数据?当我看到 Mongo 结构时,它与 profile.address 完全相同。有人可以解释为什么以及什么时候我应该使用这样的自定义助手,因为当我尝试实现某些东西但不知道原因时它会让我感到烦恼。
Meteor 用户文档中的电子邮件结构
用户电子邮件的结构是一个数组,主要是因为您可以have more than one email address与您的帐户相关联:
{
...
emails: [
{
address: 'someone@provider.com'
verified: false // or true
}
]
...
}
显示没有助手的电子邮件
为了在没有额外帮助的情况下成功显示电子邮件,因此您需要将它们全部迭代:
{{#each userku}}
<ul>
{{#each emails}}
<li>{{this.address {{#if this.verified}}(verified){{/if}}</li>
{{/each}}
<li>{{profile.name}} </li>
</li>
{{/each}}
如果用户有多个关联的电子邮件,这当然会显示所有电子邮件。
仅显示第一封电子邮件
要始终只显示第一封电子邮件,您需要另一个助手:
Template.reg_user.helpers({
firstMail (emails){
return emails[0];
}
});
并这样称呼它:
{{#each userku}}
<ul>
{{#with firstMail emails}}
<li>{{this.address {{#if this.verified}}(verified){{/if}}</li>
{{/with}}
<li>{{profile.name}} </li>
</li>
{{/each}}
进一步阅读
请注意,我在我的示例中也使用了 verified
字段,更多信息可在此处阅读:
https://docs.meteor.com/api/passwords.html#Accounts-verifyEmail
此处关于该主题的一般阅读:
我正在使用 MeteorJs 开发一个系统,我需要获取在我的 MongoDB 中注册的用户的所有电子邮件和个人资料。这是我的 publish.js
if (Meteor.isServer) {
Meteor.publish('Userlist', function() {
return Meteor.users.find({}, {fields: {emails: 1, profile: 1}});
});
}
这是我在模板级别订阅用户数据的地方res_user.js
Template.reg_user.onCreated(function() {
this.subscribe('Userlist');
});
Template.reg_user.helpers({
userku: function() {
let user = Meteor.users.find();
return user;
},
});
这是我的html
{{#each userku}}
<ul>
<li>{{emails.address}} </li>
<li>{{profile.name}} </li>
</li>
{{/each}}
当我试图在我的 html 中重复它时,它不显示任何电子邮件,只显示个人资料名称,看完这个 tutorial 我发现需要一些自定义助手来接收电子邮件,所以知道我添加了新助手
Template.reg_user.helpers({
// same code here
getEmail: function(){
return this.emails[0].address;
}
});
并在我的 html 中调用这个助手而不是普通的
{{#each userku}}
<ul>
<li>{{getEmail}} </li>
<li>{{profile.name}} </li>
</li>
{{/each}}
为什么我不能用正常的方式取email.address数据?当我看到 Mongo 结构时,它与 profile.address 完全相同。有人可以解释为什么以及什么时候我应该使用这样的自定义助手,因为当我尝试实现某些东西但不知道原因时它会让我感到烦恼。
Meteor 用户文档中的电子邮件结构
用户电子邮件的结构是一个数组,主要是因为您可以have more than one email address与您的帐户相关联:
{
...
emails: [
{
address: 'someone@provider.com'
verified: false // or true
}
]
...
}
显示没有助手的电子邮件
为了在没有额外帮助的情况下成功显示电子邮件,因此您需要将它们全部迭代:
{{#each userku}}
<ul>
{{#each emails}}
<li>{{this.address {{#if this.verified}}(verified){{/if}}</li>
{{/each}}
<li>{{profile.name}} </li>
</li>
{{/each}}
如果用户有多个关联的电子邮件,这当然会显示所有电子邮件。
仅显示第一封电子邮件
要始终只显示第一封电子邮件,您需要另一个助手:
Template.reg_user.helpers({
firstMail (emails){
return emails[0];
}
});
并这样称呼它:
{{#each userku}}
<ul>
{{#with firstMail emails}}
<li>{{this.address {{#if this.verified}}(verified){{/if}}</li>
{{/with}}
<li>{{profile.name}} </li>
</li>
{{/each}}
进一步阅读
请注意,我在我的示例中也使用了 verified
字段,更多信息可在此处阅读:
https://docs.meteor.com/api/passwords.html#Accounts-verifyEmail
此处关于该主题的一般阅读: