2014-09-04 22 views
5

Sto cercando di imparare la meteora e sto incontrando qualche ostacolo. Ho un paio di modelli annidati per visualizzare tutte le informazioni dell'utente nella mia app:Come accedere alle proprietà degli utenti di Meteor nell'array?

users_list.html:

<template name='usersList'> 
    <div class='users'> 
    {{#each user}} 
     {{> userItem}} 
    {{/each}} 
    </div> 
</template> 

e user_item.html:

<template name='userItem'> 
    <div class='user'> 
    <div class='user-content'> 
     <h3>User:</h3> 
     <h4>Email: {{emails}}</h4> 
      <h5>ID: {{_id}}</h5> 
      ... 
    </div> 
    </div> 
</template> 

e il modello helper associato:

Template.usersList.helpers({ 
    user: function(){ 
    return Meteor.users.find().fetch(); 
    } 
}); 

Questo funziona per le proprietà di livello superiore, ma se provo ad accedere esplicitamente a .addres s proprietà sull'indice 0 nella matrice di messaggi di posta elettronica modificando la linea di cui sopra in user_item.html:

<h4>Email: {{emails[0].address}}</h4> 

Meteor si lamenta:

Exception in queued task: Error: Can't call non-function: [object Object]...

Questo è fonte di confusione per me, perché posso fare questo nella console :

var userz = Meteor.users.find().fetch(); 
userz[0].emails[0].address // "[email protected]" 

Qualche idea sul perché a Meteor non piace questo?

Inoltre, stavo pensando in generale che potrei aver bisogno di memorizzare il contenuto dell'array e-mail in una variabile e ripetere lo stesso schema sopra, tranne annidando un modello email_list e email_item nel modello user_item. Questo sembra fattibile ma eccessivamente complicato per questo caso d'uso.

In definitiva, sto solo cercando di imparare e implementare un modello ragionevole per l'accesso e la visualizzazione degli attributi nidificati dei documenti nelle raccolte. Qualsiasi pensiero o guida sarà molto apprezzato.

risposta

6

Questo è solo un problema con la sintassi, provate questo:

<h4>Email : {{emails.[0].address}}</h4> 

è necessario accedere al primo elemento (una proprietà che chiave è "0") della matrice messaggi di posta elettronica utilizzando la sintassi del punto.

https://github.com/meteor/meteor/wiki/Using-Blaze#dotted-helpers-with-numeric-indices

È anche possibile utilizzare questo modello per la visualizzazione di un elenco di messaggi di posta elettronica:

(from userItem) 
{{> emailsList}} 

<template name="emailsList"> 
    <ul> 
    {{#each emails}} 
     {{> emailItem}} 
    {{/each}} 
    </ul> 
</template> 

<template name="emailItem"> 
    <li>Address : {{address}}</li> 
</template> 

Non credo che questo è troppo complicato (solo un altro paio di modelli), e con questo Meteor è molto facile da fare. Ogniqualvolta sia ragionevole, suddividere i modelli in più sottoprogrammi, semplificherà e velocizzerà il rerendering DOM sull'invalida dei dati.

Inoltre, non è necessario utilizzare fetch quando si restituisce un cursore in un helper: il blocco #each è ottimizzato per funzionare direttamente con il cursore anziché con gli array. (sarà abbastanza intelligente per eseguire nuovamente solo un elemento modificato anziché l'intera lista).

+0

Questo funziona in Meteor, grazie. Tuttavia, questo codice non funziona nella console. Il mio javascript è spento oggi? Non capisco perché abbiamo bisogno. notazione per ottenere l'elemento nell'indice 0 dell'array email. – Chris

+0

Questo perché Spacebars (implementazione di Meteor di Handlebars) è qualcosa DIVERSO da JavaScript, la tua sintassi era OK per JS ma errata per il motore di template. – saimeunt

+0

@walter collegato alla fonte delle mie pene. Grazie per l'aiuto – Chris

1

è possibile controllare la documentazione di Blaze

per quello spettacolo di matrice nel modello, è necessario scrivere come mostra la documentazione,

In aiutanti tratteggiate, uso parentesi intorno indici numerici, ad esempio {{ currentUser.emails. [0] .Address}} invece di {{}} currentUser.emails.0.address

Good {{currentUser.emails.[0].address}}


Bad {{currentUser.emails.0.address}}

Wiki

https://github.com/meteor/meteor/wiki/Using-Blaze

Problemi correlati