2015-09-10 1 views
0

Voici un bug bizarre que j'ai. Tout d'abord voici mon codeBogue étrange avec Accounts.onCreatedUser

User = {}; 

User._defaults = { 
    emails : [], 
    enabled : true 
} 

User.defaults = function(){ 
    var defaults = _.clone(User._defaults); 
    return _.extend(defaults,{ 
    createdAt : new Date() 
    }); 
} 

Accounts.onCreateUser(function(options, user){  
    console.log(User.defaults()); 
    // returns {emails: [ { address: '[email protected]', verified: true } ], enabled: true} 

    _.defaults(user, User.defaults()); 

    user.emails.push(user.services.linkedin.emailAddress); 

    return user; 
}); 

Comme vous pouvez le voir, quand je l'appelle User.defaults() retourne un objet avec le tableau emails rempli avec l'adresse e-mail de la précédente nouvelle utilisation.

Mais ce qui est encore plus étrange, est que quand je fais ceci:

Accounts.onCreateUser(function(options, user){ 
    console.log(User._defaults, User.defaults()); 

    user.enabled = true; 
    user.emails = []; 
    user.createdAt = new Date(); 
    // _.defaults(user, User.defaults()); 

    user.emails.push(user.services.linkedin.emailAddress); 

    return user; 
}) 

Le connecté User.defaults() retourner en fait un objet avec le tableau emails vide.

Quelqu'un at-il une idée de ce que cela peut causer?

Merci!

Répondre

1

Cela aurait à voir avec la fonction Underscore clone. Si vous lisez le docs.

Créez un clone copié en surface de l'objet brut fourni. Tous les objets ou tableaux imbriqués seront copiés par référence et non dupliqués.

La partie importante est la copie peu profonde. Votre tableau n'est pas une copie réelle, c'est juste une référence. Donc, vous faites toujours référence au même tableau à chaque fois.

Je ferais ce qui suit.

User = {}; 
User.defaults = function(){ 
    return { 
    emails : [], 
    enabled : true, 
    createdAt : new Date() 
    } 
}