2013-03-09 5 views
13

Ich möchte nur die Entscheidungen hinter Backbone.Marionette Sicht auf UI-Elemente verstehen. Wenn ein Marionette.View auf einem vorhandenen DOM-Element, wie das Instanziieren:Verfügbarkeit von UI-Elementen in Marionette.View

view = new Marionette.ItemView({ 
    el: "#element", 
    ui : { 
     whatever : "#whatever" 
    } 
}); 

Ich bin in der Lage innerhalb view.initializeview.$el, die jQuery-Selektor zugreifen, so weit so gut. Wenn ich jedoch versuche, auf view.ui.whatever zuzugreifen, habe ich nur Zugriff auf den Selektor, dh die Zeichenfolge "#whatever" anstelle des eigentlichen 0quellselektors $("#whatever").

Der Grund dafür ist, dass nur render und nicht vor initialize aufgerufen wird.

Ich würde gerne wissen, ob Sie denken, dass dieses Verhalten Logik ist und warum?

Ich frage nur im Fall der Anfügen der Ansicht an eine bestehende el, wenn die Ansicht mit einer Vorlage erstellt wird, verstehe ich, warum die Bindung in render() ist.

+0

Dies ist eine Randnotiz - Sie werden auch das Verhalten erfahren, wenn Sie auf die Schaltfläche Zurück klicken, um zur Seite zurückzukehren. Der Aufruf von 'this.bindUIElements()' direkt vor der Verwendung des ui-Elements löste das Problem – Phil

Antwort

25

Das Anfügen einer Ansicht an ein vorhandenes Element ist die Ausnahme. Der normale View-Lebenszyklus umfasst den Aufruf render, und ohne dass dies der Fall wäre, gäbe es nichts, an das die UI-Elemente binden könnten.

Rufen Sie einfach this.bindUIElements() in Ihrer initialize Methode auf, wenn Sie eine Ansicht an ein vorhandenes Element anhängen müssen.

+0

Das ist, was ich tue, ich habe mich nur gewundert, warum es standardmäßig nicht getan wurde, wenn es an ein bestehendes Element angehängt wurde. Ich war mir nicht bewusst, dass es in Marionettes Philosophie als Ausnahmefall galt. Danke für deine Antwort. – alistril

+0

Tauchen Sie tiefer ein, gibt es eine Methode, 'Marionette.ItemView' zu verwenden und ihr ein' el' von bereits bestehendem DOM zu übergeben? Es scheint, dass du das 'el' immer selbst rendern musst. –

+0

Das Aufrufen von this.bindUIElements() in den Initialisierungen scheint jquery zu brechen, wenn 'triggers' mit @ ui.something verwendet wird, da die Elemente in this.ui zu der Zeit, wenn dellateEvents aufgerufen wird, keine Strings mehr sind und jquery selects brechen. Gibt es einen besseren Weg, dies zu tun? Zur Zeit rufe ich bindUIElements auf, nachdem ich die Ansicht erstellt habe, aber es fühlt sich nicht richtig an – Asgaroth

1

Wenn ich mit Marionette arbeite, lege ich den Code, der auf die ui-Elemente zugreifen muss, in die onShow-Methode. Dieses Ereignis wird ausgelöst, nachdem das Dom bereit ist und die Elemente bereit sind, bearbeitet zu werden. Innerhalb dieser Methode zeigt Ihr ui.whatever nun auf ein Element und nicht auf eine Zeichenfolge.

+0

Ja, aber die onShow impliziert, dass ich eine render habe, was wiederum bedeutet, dass ich eine Vorlage habe. In meinem Fall habe ich weder so noch OnShow jemals gefeuert werden, oder? – alistril

+0

Ich bin in der Lage, eine ItemView ohne die Vorlage zu arbeiten, aber der UI-Inhalt in der OnShow wird nicht geladen. Also ich denke, es gibt keinen guten Weg, es so zu machen.Mein anderer Vorschlag wäre, view. $ El.find ("# whatever") zu verwenden. Dadurch erhalten Sie Zugriff auf dieses Element ohne Vorlage oder Rendering. – Kalpers

Verwandte Themen