[英]Creation of user profile page with Meteor and Iron Router
我正在使用Meteor和Iron Router构建一个Web应用程序,我的目标之一是为所有用户(可以编辑他的信息)和所有用户的配置文件视图构建一个配置文件视图(可以查看)任何人)。
登录用户的配置文件视图运行良好,但我在为其他用户创建用户配置文件视图时遇到问题。 当我尝试直接在浏览器中访问带有url的某个用户配置文件( eg: localhost:3000/users/"id"
)时,它会呈现用户登录的数据,并且浏览器中的url更改为localhost: 3000/users/[object%20Object]
。
此外,当呈现具有该信息的页面时,带有对该引用的引用的标记始终为空。
以下是与此问题相关的代码:
server - publications.js
Meteor.publish('singleUser', function(userId) {
return Meteor.users.find(userId);
});
router.js
Router.map(function() {
this.route('profile', {
path:'/profile',
data: function() {return Meteor.user();}
});
this.route('user_profile', {
path: '/users/:_id',
waitOn: function() {
return Meteor.subscribe('singleUser', this.params._id);
},
data: function() {
var findById = Meteor.users.findOne(this.params._id);
if (typeof findById !== "undefined") {
Router.go(getProfileUrlById(findById), {replaceState: true});
}
}
});
});
用户档案模板
<template name="user_profile">
<h4>Username</h4>
<p>{{username}}</p>
<h4>Email:</h4>
<p>{{email}}</p>
</template>
用户资料助手
Template.user_profile.helpers({
username: function() {return Meteor.user().username},
email: function() {return Meteor.user().emails[0].address}
});
物品模板
<template name="item">
</span> <a href="{{profileUrl}}">{{author}}</a>
</template>
项目助手
Template.item.helpers({
profileUrl: function() {
var user = Meteor.users.findOne(this.userId, {reactive:false});
if(user)
return getProfileUrlById(user);
}
});
getProfileUrlById = function(id) {
return Meteor.absoluteUrl()+'users/' + id;
}
用户配置文件登录模板
<template name="profile">
<h4>Username</h4>
<p>{{username}}</p>
<h4>Email:</h4>
<p>{{email}}</p>
</template>
用户配置文件登录了帮助程序
Template.profile.helpers({
username: function() {return Meteor.user().username},
email: function() {return Meteor.user().emails[0].address}
});
我错过了什么吗?
提前致谢!
类型findById
是您取得Meteor.users.findOne
是一个对象,所以当它被强制转换为一个字符串getProfileUrlById
,它最终被[object Object]
。 您可能希望将userId
值从对象传递给该函数,而不是对象本身。
主要问题似乎是您没有将私有数据发布到其他用户的用户集合(假设您已卸载autopublish
包)。 Meteor默认只发布profile
下的字段。 例如,您的username
段不在profile
因此除了当前登录的用户之外,不会为所有用户发布。
其次,你过度复杂的路线生成。 尝试生成这样的路线:
{{#each users }}
<a href="{{ pathFor 'userAccount' }}">My account</a>
{{/each }}
这将自动使用_id
字段作为键,假设您的router.js文件如下所示:
Router.map(function () {
this.route('userAccount', {
path: '/users/:_id'
});
});
user_profile
路由的数据函数未返回任何数据,即缺少返回。 它应该是:
data: function() {
return Meteor.users.findOne(this.params._id);
}
我不确定你想要实现的目标(我建议删除它)......
if (typeof findById !== "undefined") {
Router.go(getProfileUrlById(findById), {replaceState: true});
}
使用路由时,URL应该已经是用户的配置文件ID(/ users / {id})。 除此之外,您使用用户对象调用getProfileUrlById
,而函数需要将用户ID作为字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.