Backbone.View "el" confusione


97

Come dovrebbe elessere gestita una vista ? Deve essere impostato, altrimenti gli eventi non vengono attivati ​​(vedi qui ).

Ma dovrebbe essere un elemento già presente nella pagina? Nella mia app, eseguo il rendering di un modello (jQuery Templates) in una Fancybox. Cosa dovrebbe elessere in quel caso?


11
Ho pensato: io sono l'unico a giocherellare con la elcosa.
Yugal Jindle

elè come gf. nessuno può capirli completamente.
Mahi

Risposte:


121

A view el è dove si svolge tutto il binding degli eventi. Non devi usarlo, ma se vuoi che la spina dorsale generi eventi devi fare il tuo lavoro di rendering su el. Una vista el è un elemento DOM ma non deve essere un elemento preesistente. Verrà creato se non ne prendi uno dalla pagina corrente, ma dovrai inserirlo nella pagina se vuoi vederlo fare qualcosa.

Un esempio: ho una vista che crea singoli elementi

window.ItemView = Backbone.View.extend({
    tagName: "li", //this defaults to div if you don't declare it.
    template: _.template("<p><%= someModelKey %></p>"),
    events: {
         //this event will be attached to the model elements in
         //the el of every view inserted by AppView below
        "click": "someFunctionThatDoesSomething"
    },
    initialize: function () { 
        _.bindAll(this, "render");
        this.render();
    },
    render: function () {
        this.el.innerHTML = this.template(this.model.toJSON());
        return this;
    }
});
window.AppView = Backbone.View.extend({
    el: $("#someElementID"), //Here we actually grab a pre-existing element
    initialize: function () { 
        _.bindAll(this, "render");
        this.render(new myModel());
    },
    render: function (item) { 
        var view = new ItemView({ model: item });
        this.el.append(view.render().el);
    }
});

La prima visualizzazione crea solo gli elementi dell'elenco e la seconda visualizzazione li inserisce effettivamente nella pagina. Penso che questo sia abbastanza simile a quello che accade nell'esempio ToDo sul sito backbone.js. Penso che la convenzione sia rendere i tuoi contenuti in el. Quindi l'el serve come punto di approdo o contenitore per posizionare i tuoi contenuti basati su modelli. Backbone quindi lega i suoi eventi ai dati del modello al suo interno.

Quando si crea una vista è possibile manipolare la EL in quattro modi utilizzando el:, tagName:, className:, e id:. Se nessuno di questi viene dichiarato el il valore predefinito è un div senza id o class. Inoltre, non è associato alla pagina a questo punto. Puoi cambiare il tag in qualcos'altro usando tagName (ad esempio tagName: "li", ti darà un el di <li></li>). Allo stesso modo puoi impostare l'id e la classe di el. Ancora el non fa parte della tua pagina. La proprietà el ti consente di manipolare la grana molto fine dell'oggetto el. La maggior parte delle volte utilizzo un fileel: $("someElementInThePage")che in realtà lega tutta la manipolazione che fai alla tua vista alla pagina corrente. Altrimenti se vuoi vedere tutto il duro lavoro che hai fatto nella tua vista apparire sulla pagina dovrai inserirlo / accodarlo alla pagina da qualche altra parte nella tua vista (probabilmente in rendering). Mi piace pensare a el come al contenitore che tutta la tua vista manipola.


Grazie per il chiarimento e l'esempio! Penso che non sia sempre chiaro cosa dovrebbe essere l'el in determinate situazioni e lo sviluppatore deve avere una "sensazione" per questo. Le tue spiegazioni hanno sicuramente aiutato! Una domanda, però: non definisci un el nel tuo ItemView, ma ci accedi nella funzione di rendering. Funzionerà? C'è qualche tipo di el predefinito se non lo definisci esplicitamente?
Manuel Meurer

3
Per impostazione predefinita el è un tag "div" senza id o classe. È un oggetto DOM non associato alla tua pagina DOM. Di solito lo inserisco / aggiungo alla pagina nella funzione render o nella funzione render di una vista genitore.
LeRoy

Aggiornata la mia risposta con una descrizione delle proprietà che definiscono l'el.
LeRoy

5
Immagino che il mio unico problema con l'acquisizione di un elemento preesistente con el: $ ("# someElementID") sia la tua vista probabilmente ne sa più di quanto dovrebbe, rendendo difficile riutilizzarlo. vedi "Disaccoppia la vista dal DOM ..." coenraets.org/blog/2012/01/…
Scott Coates

@scoarescoare dal momento che stai aggiungendo la proprietà el all'istanziazione, la vista stessa non sa più di quanto dovrebbe, rimane modulare e in grado di accettare qualsiasi $ (el) tu voglia consegnarla. Quindi questo lo rende abbastanza riutilizzabile, davvero.
Metagrapher

6

Un po 'vecchio ora, ma anch'io ero confuso, quindi per altre persone che arrivano qui, questo violino potrebbe aiutare - http://jsfiddle.net/hRndn/2/

var MyView = Backbone.View.extend({

    events: {
        "click .btn" : "sayHello",
    },

    sayHello : function() {
        alert("Hello");
    },


    render : function() {
        this.$el.html("<input type='button' class='btn' value='Say Hello'></input>");

    }
});

$(function() {
    myView = new MyView({el:"#parent_id"});
    myView.render();
});

Ho seguito questo modello e vorrei non averlo fatto. Per distruggere una vista e rimuovere le associazioni, la convenzione di backbone è view.remove (). Questo distrugge $ el e lo rimuove dal DOM, quindi quando devi mostrare di nuovo la vista, $ el non esiste.
JJ

@ Mark what If sto usando un'architettura composita come marionette .... devo ancora avere la view's el?
afr0

il codice del violino non funziona, poiché il collegamento dovrebbe essere jsfiddle.net/hRndn
Izzy

@Mahi Sì hai ragione. Probabilmente ho incollato un link sbagliato, scusa. Questo funziona: jsfiddle.net/hRndn/127
Izzy

1

Vuoi che il tuo "el" faccia riferimento a un elemento che contiene un elemento figlio che ha un evento che attiva un cambiamento nella tua vista. Potrebbe essere largo quanto un tag "body".


Hmm, nemmeno questo lo chiarisce. La maggior parte delle volte gli elementi che potrebbero innescare un cambiamento nella mia vista si trovano all'interno del modello che la vista visualizza, quindi prima che venga renderizzato questi elementi non esistono ancora.
Manuel Meurer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.