如何在角度流星中更新用户字段?

时间:2015-08-23 07:12:11

标签: angularjs meteor angular-meteor

我已使用空收藏夹数组配置要创建的所有用户: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;
});

1 个答案:

答案 0 :(得分: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();
  }
});

Opinionated Meteor.users哲学

我喜欢围绕3个属性构建我的用户对象:

  • User.profile - >发布到客户端,并由客户端通过客户端代码直接修改
  • User.public - >发布到客户端,但不能通过服务器端Meteor methods
  • 进行修改
  • User.private - >未发布到客户端(即只能在服务器代码上读取),并且只能通过服务器代码修改(使用客户端模拟)

只需确保在删除insecureautopublish软件包时,使用服务器代码中的Meteor.users.allow()函数仔细检查集合安全性

如果要验证当前项目中是否正在使用meteor listinsecure软件包,请运行autopublish。注意:默认情况下,Meteor会在您首次创建应用时安装它们)

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