Meteor 中的 Iron 路由器/用户详细信息问题

问题描述 投票:0回答:1

我对 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”的方式......

谢谢!!

meteor iron-router
1个回答
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)
  };
}
© www.soinside.com 2019 - 2024. All rights reserved.