2015-08-23 1 views
2

Я настроил всех пользователей, которые будут созданы с пустым избранное массива: user.favorites: []Как обновить поле пользователя в угловом метеор?

Поскольку сбор пользователей обрабатывают по-разному, как я должен опубликовать, подписаться, а также доступ подписался избранные данные в угловом-метеором?

Вот что я до сих пор:

// Meteor.methods ========================================== 
addFavorite: function(attendeeId){ 

var loggedInUser = Meteor.user(); 
if(!loggedInUser){ 
    throw new Meteor.Error("must be logged in"); 
} 

    loggedInUser.favorites.push(attendeeId); 
    loggedInUser.username = loggedInUser.username+"x"; 

    console.log(loggedInUser.favorites); 

} 


// controller ======================================== 
    $scope.addFavorite = function(attendeeId){ 
     $meteor.call("addFavorite", attendeeId); 
    } 

// server ======================================================= 
Meteor.publish('myFavorites', function(){ 
    if(!this.userId) return null; 

    return Meteor.users.find(this.userId); 
}); 

Meteor.users.allow({ 

    insert: function(userId, doc){ 
     return true; 
    }, 

    update: function(useId, doc, fieldNames, modifier){ 
     return true; 
    }, 

    remove: function(userId, doc){ 
     return true; 
    } 

}); 

User.favorites пуст. Когда вызывается addFavorite, он регистрирует массив с единственным userId, который вообще не обновляет mongoDB. Похоже, что Meteor.user() не обновляется. Кто-нибудь знает, что я делаю неправильно? Спасибо!

EDIT Последняя итерация кода. Фавориты передаются в $scope.favorites, но не реагируют. Как это исправить? Благодаря!

// publish 
Meteor.publish('myFavorites', function(){ 
    if(this.userId){ 
     return Meteor.users.find(this.userId, { 
      fields: { 
       favorites: 1 
      } 
     }); 
    }else{ 
     this.ready(); 
    } 
}); 

// subscribe 
$meteor.subscribe('myFavorites') 
    .then(function(subscriptionHandle) 
{ 
    var user = $meteor.collection(function(){ 
     return Meteor.users.find({_id: Meteor.userId()}); 
    }); 
    $scope.favorites = user[0].favorites; 
}); 

ответ

2

tldr;

Сбор счетов является реактивным, но по умолчанию только username, emails, and profile fields are published. Самое быстрое исправление - присоединить избранное в качестве нового поля в объекте User.profile.

// Meteor.methods ========================================== 
addFavorite: function(attendeeId){ 

var loggedInUser = Meteor.user(); 
if(!loggedInUser){ 
    throw new Meteor.Error("must be logged in"); 
} 
    if (loggedInUser.profile.favorites){ 
     loggedInUser.profile.favorites.push(attendeeId); 
    } 
    else { 
     loggedInUser.profile.favorites = []; 
     loggedInUser.profile.favorites.push(attendeeId); 
    } 
    loggedInUser.username = loggedInUser.username+"x"; 

    console.log(loggedInUser.profile.favorites); 

} 

Хотя сейчас вы, вероятно, пишете для пользователя, который можно проверить с помощью meteor mongo ->db.users.find().pretty(), но подписка не публикует свое поле фаворитов.

Альтернативный подход

В качестве альтернативы, вы можете опубликовать поле избранное

// Server code -------- 
Meteor.publish("userData", function() { 
    if (this.userId) { 
    return Meteor.users.find({_id: this.userId}, 
          {fields: {'favorites': 1}}); 
    } else { 
    this.ready(); 
    } 
}); 

упрямый Meteor.users философии

Мне нравится структурировать мои пользователи объекта вокруг 3 свойства:

  • User.profile -> опубликовано клиенту и напрямую модифицируется b у клиента через код на стороне клиента
  • User.public -> опубликованы к клиенту, но не модифицируемое, кроме как через сторону сервера Meteor methods
  • User.private -> не публикуется клиенту (т.е. доступны только для чтения на серверном коде), и только изменяемый с помощью серверного кода (с имитацией клиента)

Просто убедитесь, что при удалении insecure и autopublish пакетов, которые вы дважды проверить вашу безопасность Коллекции с помощью Meteor.users.allow() в вашем сервере код

Запуск meteor list, если вы хотите проверить, используются ли в вашем текущем проекте пакеты и autopublish.Примечание: По умолчанию Meteor делает их установить, когда вы сначала создать приложение)

// Server code -------- 
Meteor.publish("userData", function() { 
    if (this.userId) { 
    return Meteor.users.find({_id: this.userId}, 
          {fields: {'public': 1}}); 
    } else { 
    this.ready(); 
    } 
}); 
+0

Спасибо за ваш ответ, я думал о помещении его в профиле, но я хочу любимец пользователя видимых только пользователь, и профили пользователей являются общедоступными. –

+0

Я хотел бы отметить, что я удалил autopublish и небезопасно –

+0

Создайте издателя, который включает в себя ключи, которые вы хотите поделиться с текущим пользователем, а затем подписаться на него. Это позволяет расширять опубликованные ключи за пределами только профиля. –