我对Meteor相对较新,并且暂时陷入了一个问题。我有一个/ users /:_ id路由,它应该显示特定于该用户ID的详细信息。但是,每当我点击该路线时,它都会显示当前登录用户的信息,而不是我想要查看其详细信息的用户的信息。
这是我的路线:
Router.route('/users/:_id', {name: 'Users', controller: 'usersDetailController'});
这是我的usersDetailController:
usersDetailController = RouteController.extend({
waitOn: function () {
Meteor.subscribe('userProfileExtended', this.params._id);
},
onBeforeAction: function () {
var currUserId = Meteor.userId();
var currUser = Meteor.users.findOne({_id: currUserId});
console.log('admin? ' + currUser.isAdmin);
if (!currUser.isAdmin) {
this.render('accessDenied');
} else {
this.next();
}
},
action: function() {
this.render('Users');
}
});
这是我的服务器/发布:
Meteor.publish('userProfileExtended', function() {
return Meteor.users.find({_id: this.userId});
});
用户详细信息模板:
<template name="Users">
<form>
{{#with user}}
<div class="panel panel-default">
<div class="panel-heading">{{profile.companyName}} Details</div>
<div class="row">
<div class="col-md-4">
<div class="panel-body">
<p><label>Company: </label><input id="Company" type="text" value={{profile.companyName}}></p>
<p><label>Email: </label><input id="Email" type="text" value={{emails.address}}></p>
<p><label>Phone: </label><input id="Phone" type="text" value={{profile.phoneNum}}></p>
<p><label>Tire Markup: </label><input id = "tireMarkup" type="text" value={{profile.tireMarkup}}></p>
<p><button class="saveUserDetails">Save</button></p>
<p><button class="deleteUser">Delete User</button></p>
</div>
</div>
</div>
</div>
{{/with}}
这是我的模板助手:
Template.Users.helpers({
user: function() {
return Meteor.users.findOne();
}
}); 有人可以帮忙吗?我认为问题是我引用“this.userId”...
的方式谢谢!
答案 0 :(得分:1)
您需要更改发布功能,以使用订阅时指定的userId
参数:
Meteor.publish('userProfileExtended', function(userId) {
return Meteor.users.find(userId,{
fields:{
'username':1,
'profile.firstName':1,
'profile.lastName'
}
});
});
在发布功能中,userId
将等同于您调用Meteor.subscribe
的任何值,在这种情况下,它将保留this.params._id
。
请注意使用正确的路由参数语法,如果声明路径为/users/:_id
,则需要使用this.params._id
引用该参数。
另请注意,如果您只需要在界面中显示特定字段,那么将整个用户文档发布到客户端是不安全的,这就是您要使用fields
选项的原因Collection.find
仅发布用户文档的子集。
编辑:
我建议使用路由data
函数来指定渲染模板时要应用的数据上下文,如下所示:
data: function(){
return {
user: Meteor.users.findOne(this.params._id)
};
}