2015-10-22 4 views
2

У меня есть приложение, в котором я использую помощник шаблона. У меня есть следующий код:Meteor UI helper with Meteor.users

UI.registerHelper('ProfileNameByUserId', function(userid) { 
    console.log('Userid: ' + userid); 
    var user = Meteor.users.findOne({'_id': userid}); 
    console.log.log('User:' + user); 
    return user.username 
}); 

Я звоню это в моем шаблоне следующим образом:

{{#each getDocuments}} 
    {{ProfileNameByUserId userid}} 
{{/each}} 

и в помощнике шаблона:

Template.documentsIndex.helpers({ 
    getDocuments: function() { 
    return Documents.find({}, { sort: { createdAt: -1 }}); 
    } 
}); 

публикации и подписки являются следует:

Routes.route('/documents', { 
    name: 'documents', 
    subscriptions: function (params, queryParams) { 
    this.register('documentsIndex', Meteor.subscribe('documents')); 
    }, 
    action: function (params, queryParams) { 
     ..... 
    }); 
    } 
}); 

Meteor.publish('documents', function() { 
    return Documents.find({}) 
}); 

Я уверен, что userId передается, поскольку оператор console.log показывает правильный идентификатор. Проблема в том, что пользователь «undefined», поэтому он не может найти имя пользователя.

Я использую SimpleSchema определить схему пользователей, которая выглядит следующим образом:

Users = Meteor.users; 

Schema = {}; 

Schema.UserProfile = new SimpleSchema({ 
    firstName: { 
     type: String, 
     optional: true 
    }, 
    lastName: { 
     type: String, 
     optional: true 
    }, 
    gender: { 
     type: String, 
     allowedValues: ['Male', 'Female'], 
     optional: true 
    }, 
}); 

Schema.User = new SimpleSchema({ 
    username: { 
     type: String, 
     optional: true 
    }, 
    emails: { 
     type: Array, 
     optional: true 
    }, 
    "emails.$": { 
     type: Object 
    }, 
    "emails.$.address": { 
     type: String, 
     regEx: SimpleSchema.RegEx.Email 
    }, 
    "emails.$.verified": { 
     type: Boolean 
    }, 
    createdAt: { 
     type: Date, 
     optional: true, 
     denyUpdate: true, 
     autoValue: function() { 
      if (this.isInsert) { 
       return new Date(); 
      } 
     } 
    }, 
    profile: { 
     type: Schema.UserProfile, 
     optional: true 
    }, 
    services: { 
     type: Object, 
     optional: true, 
     blackbox: true 
    }, 
    roles: { 
     type: [String], 
     optional: true 
    } 
}); 

Meteor.users.attachSchema(Schema.User); 
}); 

Замена Meteor.users.findOne() в помощнике шаблона с Users.findOne() не работает.

Любая идея, почему пользователь остается неопределенным?

+0

Я заметил несколько вещей, которые могут не работать в вашем коде, я могу проверить его позже в моем проекте. Пока взгляните на мой ответ, он должен работать нормально – KG32

+0

Отредактированный исходный вопрос, чтобы включить схему и паб/sub. – wiwa1978

ответ

1

Вам необходимо добавить публикацию и подписку для пользователей, которые вы хотите показать.

В самом общем случае, в котором публикуются все пользователи:

Meteor.publish('allUsers', function() { 
    return Meteor.users.find(); 
}); 

Подписаться на это в вашем маршруте, и вы не будете иметь пользователь неопределенный в вашем помощнике.

Обратите внимание, что вы должны публиковать только тех пользователей, которые вам нужны, но так как я не знаю структуры приложения, я не могу дать вам запрос на это.

+0

Это действительно работает. Я не понял, что должен был добавить еще одну подписку для пользователей. Я думал, что Meteor.users - это специальная коллекция, которая всегда публиковалась. – wiwa1978

+0

Яркое недоразумение. Если это так, это приведет к проблемам безопасности и масштабирования. – challett