2015-09-10 3 views
0

Вот странная ошибка, которую я испытываю. Во-первых вот мой кодСтранная ошибка с 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; 
}); 

Как вы можете видеть, когда я называю User.defaults() он возвращает объект с emails массив, заполненный адрес электронной почты предыдущего нового использования.

Но что еще страннее, что когда я делаю это:

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; 
}) 

Вошедший User.defaults() фактически возвращает объект с emails массив пуст.

У кого-нибудь есть идея, что может вызвать это?

Спасибо!

ответ

1

Это должно было бы иметь функцию Underscore clone. Если вы читаете docs.

Создайте мелкокопированный клон предоставленного простого объекта. Любые вложенные объекты или массивы будут копироваться по ссылке, а не дублироваться.

Важной частью является мелкая копия. Ваш массив не является фактической копией, это просто ссылка. Таким образом, вы всегда ссылаетесь на один и тот же массив каждый раз.

Я сделал бы следующее.

User = {}; 
User.defaults = function(){ 
    return { 
    emails : [], 
    enabled : true, 
    createdAt : new Date() 
    } 
} 
Смежные вопросы