修改集合的对象属性将删除所有其他属性

时间:2015-09-05 02:44:01

标签: angularjs meteor angular-meteor

在集合对象中的对象中添加数组会删除该对象中的所有其他数组。

考虑事件集合的成员:

{
        "_id" : "EfEq7niEyLLatb7fb",
        "attendeeFavorites" : {
                "mRRYzNBaFEmuqCrLi" : [ ],
                "jbm8BJJ3PJCyWRJwz" : [ ],
                "9Ze5M6CkHdLwkJdbu" : [ ],
                "bH5q4himZawTTrbyc" : [ ]
        }
}

attendeeFavorites的密钥是userIds。当该用户登录时,他们可以将字符串添加到其对应的阵列。这是活动代码:

$meteor.autorun($scope, function () {

    var event = $scope.$meteorObject(Events, {}).subscribe('events');

    if( event.attendeeFavorites && event.attendeeFavorites[Meteor.userId()] ) {
        $scope.favorites = event.attendeeFavorites[Meteor.userId()];
    }
});

$scope.addFavorite = function(){
    $scope.favorites.push("x");
};

和发布功能:

Meteor.publish('events', function(){
    var projection = {
        name: 1
    };
    projection["attendeeFavorites."+this.userId] = 1;
    return Events.find({},{fields: projection});
});

例如,当用户9Ze5M6CkHdLwkJdbu调用addFavorite()时,会向x数组添加attendeeFavorites,但会删除所有其他条目。这将上述内容变为:

{
        "_id" : "EfEq7niEyLLatb7fb",
        "attendeeFavorites" : {
                "9Ze5M6CkHdLwkJdbu" : [
                        "x"
                ]
        }
}

为什么会这样?

*编辑* 将发布功能重新编写为

Meteor.publish('events', function(){
    return Events.find({});
});

修复了它,但这不是一个真正的解决方案,因为我不希望用户能够查看其他用户的收藏夹数组。

1 个答案:

答案 0 :(得分:0)

创建特定于用户的订阅:

Meteor.publish('user_favorites').then(function() {
    return Events.find({attendeeFavorites: this.userId})
});

这将仅返回该与会者的收藏

然后当你订阅它时:

$scope.favorites = $scope.$meteorCollection(Events).subscribe('user_favorites');

但是,如果您阅读angular-meteor文档,最好使用$ scope。$ meteorSubscribe:

$scope.$meteorSubscribe('user_favorites', function() {
    $scope.$meteorCollection(Events, false); // false will prevent it from updating the db automatically. remove if you do want it to update
});

$ scope。$ meteorSubscribe将在范围被销毁时自动终止订阅。

请记住,我几乎睡着了,如果这不满足,那么我会在早上解决它:)

编辑 - 我错过了你想要做的事情,所以试试这个:

在偶数收藏中,您可以按ID列出与会者列表:

{
    attendees: ['afasd89as8d923', 'q23rqwasdfj23', '..']
}

然后,每个用户都可以包含一组有关联收藏的有人参与的活动:

[
    {eventId: 'asdfasdf22q39f8', favorites: ['1', '2', '3']},
    {eventId: 'as2234assdf8989', favorites: ['asdf', 'foo', '3']}
]

你如何为我的收藏品建模我不知道但是没关系。每当用户访问页面时,他/她已经可以访问他们自己的收藏夹,那么您只需显示与该事件相关联的收藏夹。当然,如果您每个活动都有不同的收藏。

实际上,您不需要在每个活动中保留一份与会者名单,但这可能会为其他目的派上用场。