2011-08-17 5 views
26

Sto utilizzando Handlebars.js come strumento di template per la mia app Backbone.js. Il mio render funzioni nel mio punto di vista di solito simile al seguente:Interrompi lo scheletro dall'aggiunta di div ambientali a una vista?

var source = $("#round").html(); 
    var template = Handlebars.compile(source); 
    var context = JSON.parse(JSON.stringify(this.model)); 
    var html = template(context); 
    $(this.el).html(html); 
    return this; 

Quanto sopra viene aggiunto alla vista principale applicazione tramite il seguente codice (questo è il codice che chiama il codice di cui sopra):

$('div#round-container', this.el).append(roundView.render().el); 

Il mio modello di manubri gestisce tutto lo stile e il layout, quindi lascio l'elemento "el" di una vista vuota. Backbone.js aggiunge automaticamente i tag div che circondano il template di Handlebars. Presumo che questo sia dovuto al fatto che l'elemento "el" è vuoto. C'è un modo per impedire l'aggiunta dei tag div circostanti? Grazie!

risposta

40

Che cosa sta succedendo è this.el creato al volo perché non è mai stato impostato esplicitamente da voi. Sono disponibili due opzioni:

  1. Si dovrebbe specificare l'elemento che si desidera creare con tagName, className e/o id e lasciare che la spina dorsale di creare per voi.

  2. In render è necessario impostare this.el sul contenuto del modello di manubri. Quindi avresti this.el = $(template(context)).

La documentazione hanno una spiegazione esteso - http://documentcloud.github.com/backbone/#View-el

+5

setElement è una buona opzione anche –

+1

Dopo goi ng con l'opzione 2., l'evento di invio non viene attivato – svlada

+0

@svlada, 'setElement' chiama anche' this.undelegateEvents(); 'e' this.delegateEvents(); 'che assicura che gli eventi nel hash degli eventi vengano applicati al nuovo elemento. Puoi chiamarli yourselft se setElement è fuori questione. [fonte] (http://backbonejs.org/docs/backbone.html#section-162) –

5

Un altro modo semplice è quello di aggiungere i childNodes della resi elemento invece

$('div#round-container', this.el).append(roundView.render().el.childNodes); 
+1

Non usare questo, perderai tutti i tuoi eventi nelle tue visualizzazioni. – Brent

+0

Abbiamo trascorso 2 ore cercando di capire perché .. :( – Brent

3

o aggiungere il codice html della resi elemento, ad esempio:

$('div#round-container', this.el).append(roundView.render().el.html()); 
Problemi correlati