2015-12-30 2 views
0

Примечание: Весь исходный код можно найти здесь:Meteor: Как подписаться/показать имена пользователей, когда this.userId опубликована

https://github.com/Julian-Th/crowducate-platform/

Я следующие функции паба:

Meteor.publish('editableCourses', function() { 
    return Courses.find({"canEditCourse": { $in: [ this.userId ] } }); 
}); 

Meteor.publish("userData", function() { 
    if (this.userId) { 
     return Meteor.users.find({_id: this.userId}, 
      {fields: {'realname': 1, 'username': 1, 'gender': 1, 'language': 1, 'biography': 1 }}) 
    } 
}); 

Meteor.publish("allUsernamesExceptCurrent", function() { 
    // Get current user 
    var currentUserId = this.userId; 

    // Get all users except current, 
    // only get username field 
    var users = Meteor.users.find(
    {_id: {$ne: currentUserId}}, 
    {fields: {username: 1}} 
); 

    return users; 
}); 

Вот шаблон:

<template name="myTeachingCourses"> 
    <button class="btn btn-primary js-create-course"><i class="fa fa-plus"></i> Create a Course</button> 
    <hr> 
    <div class="row"> 
     <ul class="thumbnails list-unstyled"> 
      {{#each courses}} 
      {{>courseCard}} 
      {{/each}} 
     </ul> 
    </div> 
</template> 

Помощник с подпиской:

Template.myTeachingCourses.helpers({ 
    'courses': function(){ 
     return Courses.find(); 
    } 
});  

Template.myTeachingCourses.created = function() { 
     // Get reference to template instance 
     var instance = this; 

     // Subscribe to all published courses 
     instance.subscribe("editableCourses"); 
    }; 

Проблема: шаблон не отображает созданные курсы. Создатель курса не может видеть свои собственные курсы или добавлять других сотрудников. Интересно, может ли быть причина, потому что canEditCourse теперь представляет собой массив с именами пользователей, а не с идентификаторами.

My JSON for Courses: 
{ 
    "_id" : "hRX8YABpubfZ4mps8", 
    "title" : "Course Title here", 
    "coverImageId" : "Qojwbi2hcP2KqsHEA", 
    "author" : "Name", 
    "keywords" : [ 
     "test", 
     "meteor" 
    ], 
    "published" : "true", 
    "about" : "Testing", 
    "canEditCourse" : [ 
     "User1" 
    ], 
    "createdById" : "zBn6vtufK2DgrHkxG", 
    "dateCreated" : ISODate("2015-12-29T21:42:46.936Z") 
} 

Via this вопрос, который я узнал, что хранение имен пользователей в массиве не является хорошей идеей, сейчас очевидным причинам. Вначале я фактически хранил идентификаторы вместо имен пользователей, но затем менял их, потому что использовать имя пользователя для автозаполнения с помощью typeahead и рендеринг идентификаторов всех соавторов нехорошо. Каков наилучший способ исправить это? Другими словами, как можно сделать все созданные курсы.

+1

Я предлагаю вам приобрести пакет MeteorToys (бесплатная версия в порядке). используйте CTRL + M, чтобы просмотреть ваши данные в браузере. Это облегчает отладку жизни. – MrE

ответ

1

Итак, как вы сами ответили, поле для сбора ваших курсов canEditCourse имеет массив usernames, а не userId, поэтому запрос ничего не вернет.

+0

как об изменении помощника, к этому: 'Template.myTeachingCourses.helpers ({ 'курсы': функция() { вар MyUser = Meteor.user() имя пользователя; возвращение Courses.find ({" canEditCourse. ": {$ in: [myUser]}}); } });' Это похоже на работу. Это нормально? –

+0

Конечно. Это был мой ответ на ваш другой вопрос, но у вас все еще есть проблема возможной изменчивости имени пользователя: если пользователь меняет свое имя пользователя, ваш поиск имени пользователя вернет новое имя пользователя, и если вы не обновите все курсы для замены имен пользователей в массиве всякий раз, когда пользователь меняет имя пользователя, имя пользователя будет старым. Это означает, что новое имя пользователя не будет найдено в объекте «Курс», и «Курс» не будет отображаться в результатах запроса. – MrE

+0

Что нужно делать, если вы хотите разрешить поиск по имени пользователя, это сделать наоборот: хранить объекты, которые вы хотите искать по их идентификатору (идентификатор пользователя для пользователей), и искать идентификатор пользователя из имени пользователя. Поскольку идентификатор пользователя является неизменным, если имя пользователя изменяется, это не повлияет на ваш поиск: при поиске идентификатора для имени пользователя он всегда найдет тот же идентификатор для данного пользователя, даже если имя пользователя было изменено. – MrE

 Смежные вопросы

  • Нет связанных вопросов^_^