2015-03-12 21 views
13

Ho avviato un'app minima basata su boilerplate con gli account modulo-ui.Come aggiornare parzialmente mete.users.profile?

C'è una raccolta creata che chiama gli utenti uno dei suoi elementi è profilo, questo ha di nuovo un elemento chiamato "nome" che ottiene il nome di login.

Con questa applicazione di test è un'opzione per aggiornare un profilo utente. I dati per l'aggiornamento provengono da un modulo di invio. Ho allegato l'evento listener qui

Template.profile.events({ 
    'submit form': function(event) { 
    event.preventDefault(); 
    var data = SimpleForm.processForm(event.target); 
    Meteor.users.update(Meteor.userId(), {$set: {profile: data}}); 
    } 
}); 

Quindi i dati hanno tutto dal modulo. Il "nome" del login non è contenuto nel modulo, quindi non è nemmeno nei dati.

prima dell'aggiornamento ho users.profile.name -> contiene i dati dopo l'aggiornamento ho users.profile. * -> * è uguale a tutto il modulo ma "nome" è scomparso.

Infine: chi posso mantenere il campo profile.name? Alla fine mi piace avere in users.profile tutto da parte di PLUS il "nome" archiviato.

Grazie per qualsiasi suggerimento, mentre leggi sono nuovo di meteorite - e cerco di capire come le cose si collegano tra loro.

Michael

+2

possibile duplicato di [Aggiorna raccolta di meteora senza rimuovere o ignorare i campi esistenti] (http://stackoverflow.com/questions/16929284/update-meteor-collection-without-removing-or-overriding-existing-fields) –

risposta

19

si sta sostituendo l'intero oggetto profilo esistente con il vostro oggetto dati, quindi tutto ciò che c'era prima, tra cui la chiave di nome, sta per essere spazzato via.

Se il nome è l'unica cosa nel profilo che si desidera conservare, è sufficiente aggiungerla al proprio oggetto dati con la propria chiave. In questo modo il nuovo oggetto posto sotto il profilo avrà un campo nome che è equivalente a quello vecchio.

var data = SimpleForm.processForm(event.target); 
data.name = Meteor.user().profile.name; 
Meteor.users.update(Meteor.userId(), {$set: {profile: data}}); 
+0

Grazie , esattamente quello che stavo cercando. – MBushveld

+6

Risposta da @Quin è una soluzione più semplice 'Meteor.users.update (id, {$ set: {" profile.someNewField ": newData}});' – phocks

27

Si può facilmente tenere i dati vecchio profilo durante l'aggiornamento le parti che si desidera modificate in questo modo:

Meteor.users.update(id, {$set: {"profile.someNewField": newData}}); 

Assicurarsi che "profile.someNewField" è tra virgolette.