如何更新 angular-meteor 中的用户字段?
How to update user field in angular-meteor?
我已将所有用户配置为使用空收藏夹数组创建:user.favorites: []
由于用户collection的区别对待,我应该如何在angular-meteor中发布、订阅和访问订阅的收藏夹数据?
这是我目前的情况:
// 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;
});
tldr;
Accounts collection 是反应式的,但默认情况下只有 username, emails, and profile fields are published。最快的解决方法是将收藏夹作为新字段附加到 User.profile object。
// 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 个属性构建我的用户 object:
- User.profile --> 发布给客户端,客户端可以通过client-side代码直接修改
- User.public --> 发布给客户端,但不可修改,除非通过 server-side Meteor methods
- User.private --> 未发布到客户端(即只能在服务器代码上读取),并且只能由服务器代码修改(使用客户端模拟)
只需确保在删除 insecure
和 autopublish
软件包时,您 double-check 通过使用 Meteor.users.allow()
函数中的 Collections 安全性服务器代码
运行 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();
}
});
我已将所有用户配置为使用空收藏夹数组创建:user.favorites: []
由于用户collection的区别对待,我应该如何在angular-meteor中发布、订阅和访问订阅的收藏夹数据?
这是我目前的情况:
// 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;
});
tldr;
Accounts collection 是反应式的,但默认情况下只有 username, emails, and profile fields are published。最快的解决方法是将收藏夹作为新字段附加到 User.profile object。
// 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 个属性构建我的用户 object:
- User.profile --> 发布给客户端,客户端可以通过client-side代码直接修改
- User.public --> 发布给客户端,但不可修改,除非通过 server-side Meteor methods
- User.private --> 未发布到客户端(即只能在服务器代码上读取),并且只能由服务器代码修改(使用客户端模拟)
只需确保在删除 insecure
和 autopublish
软件包时,您 double-check 通过使用 Meteor.users.allow()
函数中的 Collections 安全性服务器代码
运行 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();
}
});