2015-03-11 11 views
5

Wenn ein Meteor Ereignishandler erstellen, was ist der Unterschied zwischen ...Was ist der Unterschied zwischen Template.Instance() vs Vorlage.data?

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

vs

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

Beide scheinen die gleichen Daten zu bringen. Gibt es einen Grund, warum ich das eine oder andere sollte?

+0

'Template.instance' ist (im Moment) nur dann sinnvoll zugreifen in Helfern. An anderen Stellen (wie dem 'erstellten' Callback, dem 'gerenderten' Callback, etc.) können Sie die Template-Instanz auf andere Weise erhalten, aber in diesen Fällen können Sie 'Template.instance' auch verwenden, wenn Sie bevorzugen. –

+0

Wie ich in meiner Antwort unten geschrieben habe, können Sie, während Sie auf diese Weise auf Template.instance() .daten zugreifen können, keine eigenen Daten in diesen Kontext einfügen, sonst besteht die Gefahr, dass sie beim nächsten Render der Vorlage verschwinden. – MrE

Antwort

2

Es ist eigentlich Template.instance() (mit einem niedrigeren i), und da diese Funktion die aktuelle Vorlageninstanz im Bereich zurückgibt (derjenige, wo das Ereignis ausgelöst wurde), gibt es keinen Unterschied mit dem zweiten Parameter eines Ereignishandlers, der auch die Aktuelle Template-Instanz, deshalb können Sie in einem Event-Handler gleichgültig auf die Template-Daten unter Verwendung von Template.instance().data oder t.data zugreifen.

Es gibt jedoch eine einfachere Möglichkeit, auf den aktuellen Datenkontext in einem Event-Handler zuzugreifen: Das Objekt this ist an den Datenkontext gebunden, in dem das Ereignis ausgelöst wurde.

7

ähnliche Frage hier:

Difference between Template.instance() and this

Das ist daran zu erkennen ist, dass:

in der Vorlage Lebenszyklus-Funktionen (OnCreated, onRendered ...) this zu Template.instance() gleich so this.data ist das gleiche wie Template.instance().data zu dieser Zeit!

In einem Helfer oder Ereignis ist this der aktuelle Datenkontext.

Also, beachten Sie eine wichtige Sache hier: den Datenkontext im Laufe der Zeit Ihre Daten, wenn Änderungen Upstream ändern können:

Wenn Sie Daten übergeben zu einer Vorlage wird die Vorlage mit den neuen Daten neu gerendert werden . Neue Daten = neuer Datenkontext.

Also, wenn Sie so etwas wie:

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

gut, diese Daten unter this sein können (das heißt der Datenkontext) in Ihrem Helfer (this.myKey), aber nur solange die Upstream-Daten nicht ändern.

Sobald sich die Upstream-Daten ändern, wird this der neue Datenkontext sein und Ihre hinzugefügten Daten NICHT enthalten.

So in der Zusammenfassung:

Wenn Sie Kontext zu Ihrer Vorlage in onCreated oder onRendered hinzufügen müssen, stellen Sie sicher, dass Sie es auf den aktuellen Datenkontext nicht binden, sondern an die Vorlage.Beispiel()

Sie tun sollten:

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

und Sie diese Daten in Helfer und Veranstaltungen über

Template.instance().myKey

Verwandte Themen