Div-Wrap für Backbone.Marionette.ItemView deaktivieren
Ich bin auf der Suche auf die Böse Katzen Backbone/Marionette tutorial Beiträge hier
http://davidsulc.com/blog/2012/04/15/a-simple-backbone-marionette-tutorial/
http://davidsulc.com/blog/2012/04/22/a-simple-backbone-marionette-tutorial-part-2/
und ich kam auf die gleiche Frage/müssen hier gepostet:
Backbone.js ausschalten einwickeln von div in render
Aber ich kann nur das erhalten, arbeiten für Rückgrat.Ansichten, kein Rückgrat.Marionette.ItemViews.
Beispielsweise von der einfachen backbone marionette tutorial links oben, nehmen AngryCatView:
AngryCatView = Backbone.Marionette.ItemView.extend({
template: "#angry_cat-template",
tagName: 'tr',
className: 'angry_cat',
...
});
Die Vorlage #angry_cat-template
sieht wie folgt aus:
<script type="text/template" id="angry_cat-template">
<td><%= rank %></td>
<td><%= votes %></td>
<td><%= name %></td>
...
</script>
Was ich nicht mag, ist, dass die AngryCatView muss
tagName: 'tr',
className: 'angry_cat',
-- wenn ich tagName
aus, dann angry_cat-template
wird umhüllt von einer <div>
.
Was ich möchte ist, geben Sie den HTML-Code in einem Ort (die angry_cat-Vorlage) und nicht die meisten HTML (alle <td>
tags) in angry_cat-template und ein wenig HTML (<tr>
tag) in AngryCatView. Möchte ich dies Schreibe, in angry_cat-Vorlage:
<script type="text/template" id="angry_cat-template">
<tr class="angry_cat">
<td><%= rank %></td>
<td><%= votes %></td>
<td><%= name %></td>
...
</tr>
</script>
Es fühlt sich einfach sauberer an mich, aber ich habe mucking um mit Derik Bailey ' s Antwort in "Backbone.js ausschalten einwickeln von div in render" und kann Sie nicht zur Arbeit für Rückgrat.Marionette.
Irgendwelche Ideen?
InformationsquelleAutor der Frage mrk | 2013-02-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
2014/02/18 — aktualisiert werden, um Platz für die Verbesserungen, die bereits von @vaughan und @Thom-Nichols in den Kommentaren
In vielen meiner itemView/layouts ich dies tun:
Der obige code funktioniert nur, wenn das wrapper-div-Element enthält ein einzelnes element, das ist, wie ich das design meines templates.
In Ihrem Fall
.children()
zurück<tr class="angry_cat">
, so sollte dies funktionieren perfekt.Ich bin damit einverstanden, es hält die Vorlagen viel sauberer.
Eine Sache zu beachten:
Diese Technik erfordert keine Kraft, nur 1 Kind-element. Blind packt
.children()
also, wenn du hast falsch gebaut, die Vorlage-zur Rückkehr von mehr als einem element, wie das erste template Beispiel mit 3<td>
Elemente, es wird nicht gut funktionieren.Erfordert es, dass Ihre Vorlage ein einzelnes element zurückgeben, wie Sie in der zweiten Vorlage, mit der Wurzel
<tr>
element.Natürlich könnte es geschrieben werden, um dies zu prüfen, wenn es sein muss.
Hier ist ein funktionierendes Beispiel für die neugierigen: http://codepen.io/somethingkindawierd/pen/txnpE
InformationsquelleAutor der Antwort bejonbee
Während ich bin sicher, es gibt einen Weg, um hack Interna
render
um es sich zu Verhalten, wie Sie möchten, wobei dieser Ansatz bedeutet, dass Sie Kampf gegen die Konventionen des Backbone und Marionette durch den ganzen Entwicklungsprozess.ItemView
muss über einen zugeordneten$el
, und durch Konvention, es ist eindiv
es sei denn, Sie geben einetagName
.Ich Mitfühlen-vor allem im Fall von Layouts und Regionen, scheint es unmöglich zu sein, zu stoppen Rückgrat erzeugen ein zusätzliches element. Ich würde empfehlen die Annahme der Konvention, während Sie lernen, die Ruhe der Rahmen und nur dann zu entscheiden, ob es sich lohnt hacking
render
sich anders Verhalten (oder wählen Sie einfach einen anderen Rahmen).InformationsquelleAutor der Antwort Tres
Diese Lösung funktioniert für re-rendering. Sie überschreiben müssen
render
.onRender
tricks nicht für die Arbeit neu darstellen. Verursachen Sie nisten auf jedem neu Rendern.InformationsquelleAutor der Antwort vaughan
Wäre es nicht sauberer zu verwenden, vanilla JS anstelle von jQuery um dies zu erreichen?
InformationsquelleAutor der Antwort Sam Samskies
Für IE9+ Sie konnte einfach firstElementChild und childElementCount:
Gibt es einen guten Grund, warum Marionette fügt automatisch die wrapper-DIV. Es ist nur, wenn Ihre Vorlage besteht aus nur einem element, wenn Sie es fallen. Damit der test für die Anzahl von untergeordneten Elementen.
Andere Möglichkeit ist die Verwendung des attachElContent Methode in jedem Marionette anzeigen. Seine default-Implementierung bedeutet re-rendert die Ansicht überschreiben, die das root-element, die innere HTML. Diese letztlich gibt Anlass zu der unendlichen Verschachtelung erwähnt in bejonbee Antwort.
Wenn Sie lieber nicht überschreiben onRender-und/oder erfordern eine Reine JS-Lösung, die folgende code könnte genau das sein, was Sie wollen:
Beachten Sie, dass für das re-Rendern zu arbeiten, die den code annimmt, dass Sie eine Vorlage mit einem einzigen Kind, das enthält alle markup-Symbole.
InformationsquelleAutor der Antwort hqcasanova