2012-05-17 3 views
6

Ich bin völlig auf Meteor graben, aber ich stehe fest, versuchen, die globale-heit der Beispiele zu reduzieren und fügen Sie eine Prise OOP.Wrapping meteor.js Lenker Vorlagen in CoffeeSkript Klassen

Derzeit mein Code sieht wie folgt aus:

# View for Search Form 
form = Template.SearchForm 
form.events = 
    'submit #search_form' : query_submitted 
    'click #load_more' : -> Songs.get_next_page() 
    'focus #query' : clear_query_field 

form.page = -> Songs.page 
form.total_pages = -> Songs.total_pages 

Aber, a la Wirbelsäule oder Rückgrat, was ich wirklich haben möchte ist so etwas wie dieses:

class SearchForm extends Template.SearchForm 
    events: 
    'submit #search_form' : query_submitted 
    'click #load_more' : -> Songs.get_next_page() 
    'focus #query' : clear_query_field 


    page : -> Songs.page 
    total_pages : -> Songs.page 

    # etc etc 

form = new SearchForm 

Was ist das Recht Weg, um eine Lenkerschablone in Meteor zu wickeln?

Ich habe es geschafft, Meteor.Collection zu umbrechen, aber weil Lenker das Objekt nach der Vorlage benennt, bin ich nicht sicher, der richtige Weg, um es für das Template zu tun.

AKTUALISIERT

@ Greg wies darauf hin, dass Sie verwenden _.extend können die Eigenschaften hinzuzufügen. Das funktioniert, aber was ist, wenn ich die Event-Handler-Methoden 'query_submitted' und 'clear_query_field' in die Klasse falten will? Etwas wie dieses:

_.extend Template.SearchForm, 
    events : 
    'submit #search_form' : @query_submitted 
    'click #load_more' : -> Songs.get_next_page() 
    'focus #query' : @clear_query_field 

    page : -> Songs.page 
    total_pages : -> Songs.total_pages 

    clear_query_field : (event) -> 
    console.log 'focus' 

    query_submitted : (event) -> 
    event.preventDefault() 
    Songs.clear() 
    Songs.query = $('#query')[0].value 
    Songs.search() 

funktioniert nicht ganz. Die Event-Handler nicht ordnungsgemäß aufgerufen werden und ich bekomme Fehler in der Konsole wie:

Uncaught TypeError: Object [object Window] has no method 'query_submitted'

, ähnlich

events : 
    'submit #search_form' : (e) -> @query_submitted(e) 

Gibt:

Uncaught TypeError: Cannot call method 'call' of undefined

Also, was fehlt?

Antwort

2

Meteor kommt mit Strich so konnte man:

_.extend Template.SearchForm, 
    events: 
    'submit #search_form' : query_submitted 
    'click #load_more' : -> Songs.get_next_page() 
    'focus #query' : clear_query_field 

    page: -> Songs.page 

    total_pages: -> Songs.page 
+0

Danke, @greg! Ich habe die _.extend-Lösung gefunden, aber ich habe immer noch Probleme, die Event-Handler-Funktionen einzuschließen. Ich habe die Frage aktualisiert, würdest du einen Blick darauf werfen? –

1

Haben Sie @ mit Template.Searchform versucht zu ersetzen. in deinen Eventbindungen?

+0

Dies funktioniert, wenn Sie zum ersten Mal mit den Handler erweitern, erstrecken sich dann wieder mit den Ereignisdefinitionen: '_.extend Template.SearchForm, clear_query_field: (event) -> bla bla _.extend Template.SearchForm Ereignisse: 'Fokus #Query': clear_query_field ... ' –

+0

@ScottSimon könnten Sie ein Update in Ihrer ursprünglichen Frage, in Bezug auf Ihre Ergebnisse. tks –