2015-03-11 10 views
5

Quando si crea un gestore di eventi Meteor, qual è la differenza tra ...Qual è la differenza tra Template.Instance() vs template.data?

'click .something': function(e,t){ 
    var data = t.data 
} 

vs

'click .something': function(e,t){ 
    var data = Template.instance().data 
} 

Entrambi sembrano far apparire gli stessi dati. C'è una ragione per cui dovrei l'una o l'altra?

+0

'Template.instance' è (al momento) utile solo in aiutanti. In altri posti (come il callback 'created', il callback' rendered', ecc.) Si può ottenere l'istanza del template in altri modi, ma in questi casi si può anche usare 'Template.instance' se si preferisce. –

+0

nota come ho scritto nella mia risposta di seguito che mentre è possibile accedere ai dati Template.instance(). In questo modo, NON si devono mettere i propri dati in questo contesto, o rischia di scomparire nel prossimo rendering Template. – MrE

risposta

2

In realtà è Template.instance() (con un i inferiore) e poiché questa funzione restituisce l'istanza del modello corrente nell'ambito (quello in cui è stato generato l'evento), non c'è differenza con il secondo parametro di un gestore di eventi, che contiene anche il attuale istanza del modello, questo è il motivo per cui è possibile accedere ai dati del modello indifferentemente utilizzando Template.instance().data o t.data in un gestore eventi.

Esiste tuttavia un modo più semplice per accedere al contesto dati corrente all'interno di un gestore eventi: l'oggetto this è associato al contesto dati in cui è stato attivato l'evento.

7

domanda simile qui:

Difference between Template.instance() and this

La cosa da capire è che:

Nelle funzioni del ciclo di vita di modello (onCreated, onRendered ...) this è pari a Template.instance() così this.data è lo stesso di Template.instance().data A QUEL MOMENTO!

In un helper o evento, this è il contesto dati corrente.

Quindi, notare una cosa importante: contesto dati possono cambiare nel tempo se le modifiche dei dati a monte:

Se si passa dati a un modello, il modello sarà nuovamente reso con i nuovi dati . Nuovi dati = nuovo contesto dati.

Quindi, se si fa qualcosa di simile:

Template.example.onCreated(function() { 
    this.data.myKey = "my example data set on template creation"; //WRONG! 
    // or equivalently: 
    Template.instance().data.myOtherKey = "another key"; //WRONG! 
}) 

bene, questi dati possono essere sotto this (vale a dire il contesto dati) nel vostro aiutante (this.myKey), ma solo fino a quando i dati upstream non cambia.

Non appena i dati a monte cambiano, this sarà il nuovo contesto di dati e NON conterrà i dati aggiunti.

Così, in sintesi:

Se avete bisogno di aggiungere contesto al modello in onCreated o onRendered, assicuratevi di NON associarlo al contesto dei dati attuali, ma per il modello.esempio()

si dovrebbe fare:

Template.example.onCreated(function() { 
    this.myKey = "my example data set on template creation"; 
    // or equivalently: 
    Template.instance().myOtherKey = "another key"; 
}) 

e si può accedere a questi dati in aiuto e gli eventi tramite

Template.instance().myKey

Problemi correlati