我已使用空收藏夹数组配置要创建的所有用户: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()没有重新更新。有谁知道我做错了什么?谢谢!
修改
最新的代码迭代。收藏夹被传递到$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;
});
答案 0 :(得分:2)
帐户集合是被动的,但默认情况下只有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();
}
});
我喜欢围绕3个属性构建我的用户对象:
只需确保在删除insecure
和autopublish
软件包时,使用服务器代码中的Meteor.users.allow()
函数仔细检查集合安全性
如果要验证当前项目中是否正在使用meteor list
和insecure
软件包,请运行autopublish
。注意:默认情况下,Meteor会在您首次创建应用时安装它们)
// Server code --------
Meteor.publish("userData", function () {
if (this.userId) {
return Meteor.users.find({_id: this.userId},
{fields: {'public': 1}});
} else {
this.ready();
}
});