2015-01-15 11 views
5

In Meteor, ich schicke zwei Objekte aus meiner db in eine Vorlage:Zugriff auf Vorlage Helfer Wörterbuch in Meteor Ereignishandler

Template.myTemplate.helpers({ 
    helper1: function() { 
    var object1 = this; // data context set in iron:router...path is context dependent 
    // modify some values in object1 
    return this; 
    }, 
    helper2: function() { 
    return Collection2.find({_id: this.object2_id}); 
    } 
}); 

Diese Vorlage hat auch einen Event-Handler die beiden Objekte oben zu verändern. Ich versuche, von oben auf helper1 und helper2 zuzugreifen, aber wenn ich den Datenkontext der Vorlage aufruft, bekomme ich nur Zugriff auf die unmodifizierte Version von object1. Wie greife ich auf die oben definierten Helfer zu?

Template.myTemplate.events({ 
    'submit form': function(event) { 
    event.preventDefault(); 
    // Access helper2 object and attributes here instead of calling Collection2.find() again 
    } 
}); 
+2

keine Möglichkeit gibt es Helfer mit der aktuellen öffentlichen API aufrufen. –

+1

Peppe, vielleicht kennst du das, aber ich habe gerade herausgefunden, dass es eine interne API für den Zugriff auf Helfer gibt - Template.myTemplate .__ helpers.get ('helper'); – bgmaster

+0

Da dies intern ist, gehe ich davon aus, dass sich die API in der Zukunft ändern wird, daher ist es möglicherweise nicht die beste Idee, dies häufig in Ihrem Code zu verwenden. – bgmaster

Antwort

4

Helfer sind nur Funktionen und kann somit rund um und auf andere Variablen nach Belieben zugewiesen weitergegeben werden, so könnten Sie eine Funktion definieren und dann die helper2 Schlüssel der Vorlage Helfer zuordnen und aufrufen, indem sie von der ursprünglichen Referenz ist Ereignishandler.

var helperFunction = function() { 
    return Collection2.find({_id: this.object2_id}); 
}; 

Template.myTemplate.helpers({ 
    helper1: function() { 
     var object1 = this; // data context set in iron:router...path is context dependent 
     // modify some values in object1 
     return this; 
    }, 
    helper2: helperFunction 
}); 

Template.myTemplate.events({ 
    'submit form': function(event) { 
     event.preventDefault(); 
     var cursor = helperFunction(); 
    } 
}); 
+0

Danke. Dieses Muster hilft ein wenig dabei, den Code zu vermeiden, den ich erreichen wollte. Das einzige was ich anmerken würde ist das in der Funktion sich ändern kann. Wenn Sie die Funktion im Ereignishandler aufrufen, wird dies das Window-Objekt anstelle des Datenkontextes. Ich finde das merkwürdig, wenn man bedenkt, dass dies im Ereignishandler immer noch der Datenkontext ist. Wenn Sie Ihre Antwort aktualisieren können, um dies widerzuspiegeln, werde ich sie als korrekt markieren. – bgmaster

+0

Wie @bgmaster bemerkt hat, müssen Sie [die Aufrufmethode] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call) aufrufen und das 'thisArg 'anstatt einfach die Funktion aufzurufen. Allerdings wissen Sie nicht, was das 'thisArg' sein soll (und es kann auch unterschiedliche Zeiten sein, wenn {{helper2}}' verwendet wurde, also funktioniert das im Allgemeinen nicht). –

0

Wenn Sie Helfer von Ereignissen ändern können, dann kann jeder Teil der Meteor-Anwendung tun, die gegen die Designphilosophie von Blaze ist!

Blaze ist entworfen, um unidirektionale Daten Bindung verlockendes System zu sein. Was Sie fragen, kann mit Angular erreicht werden (allein oder Seite an Seite mit Blaze, siehe THIS), die von Natur aus ein 2-Wege-Datenbindung verlockendes System ist.

Sie können auch überprüfen möchten Reaktion, die Bindung auch ein 2-Wege-Daten ist

Verwandte Themen