Sono abbastanza nuovo per la dorsale e cerco di capire i dettagli delle viste di zombie.Viste zombie della spina dorsale e buone pratiche
Uno zombie è, secondo questa article:
Quando ci leghiamo gli oggetti insieme attraverso eventi, ma non ci preoccupiamo di loro non associare. Finché questi oggetti sono collegati tra loro, e c'è un riferimento nel nostro codice app ad almeno uno di essi, non verranno ripuliti o eliminati. Le perdite di memoria che ne derivano sono come gli zombi dei film - nascosti negli angoli bui, in attesa di saltare fuori e mangiarci a pranzo.
L'articolo menzionate sopra suggerisce di creare un oggetto che gestisce le transizioni tra viste e quindi attuare una funzione di chiusura per rimuovere e separare la vista.
Detto questo, a seconda della situazione, da dove chiamare quella funzione da vicino?
Aggiungo una proprietà nel blocco di inizializzazione della mia vista genitore per mantenere una traccia della vista secondaria. In questo modo sono in grado di chiamare .remove() su di esso prima di sostituirlo con uno nuovo. È una buona pratica o c'è un modo migliore?
anche io non capisco perché la definizione el
e poi il rendering con
this.$el.html(this.template(this.model.attributes));
non mi permetterà di non associare la vista mentre funziona come previsto facendo
$('#sportsManDetails').html(this.$el.html(this.template(this.model.attributes)));
Per quanto riguarda l'esempio, ho appena creato una semplice app che visualizza un elenco di nomi di sportivi e che mostra maggiori dettagli quando si fa clic su un nome.
Ecco il codice e un fiddle di lavoro:
html
<script id="nameListTemplate" type="text/template">
<%= first %> <%= last %>
</script>
<script id="sportsManDetailsTemplate" type="text/template">
<ul>
<li><%= first %></li>
<li><%= last %></li>
<li><%= age %></li>
<li><%= sport %></li>
<li><%= category %></li>
</ul>
<button class="test">Test</button>
</script>
<div id="sportsMenName"></div>
<div id="sportsManDetails"></div>
JS
modello e la raccolta
var app = app || {};
app.SportsManModel = Backbone.Model.extend({});
app.SportsMenCollection = Backbone.Collection.extend({
model: app.SportsManModel
});
NameView
app.NameView = Backbone.View.extend({
tagName: 'li',
className: 'sportsMan',
template: _.template($('#nameListTemplate').html()),
initialize: function(){
this.sportsManDetailsView;
},
events: {
'click': 'showSportsManDetails'
},
showSportsManDetails: function(e){
if (typeof this.sportsManDetailsView !== 'undefined'){
this.sportsManDetailsView.remove();
}
this.sportsManDetailsView = new app.SportsManDetailsView({
model: this.model
})
},
render: function(){
this.$el.append(this.template(this.model.attributes));
return this;
}
});
NameListView
app.NameListView = Backbone.View.extend({
el: '#sportsMenName',
initialize: function(sportsMen){
this.collection = new app.SportsMenCollection(sportsMen);
this.render();
},
render: function(){
this.collection.each(function(sportsMen){
this.renderContact(sportsMen);
}, this);
},
renderContact: function(sportsMen){
var nameView = new app.NameView({
model: sportsMen
});
this.$el.append(nameView.render().el);
}
});
SportsManDetailsView
app.SportsManDetailsView = Backbone.View.extend({
// doesn't work if I use el in conjunction with
// this.$el.html(this.template(this.model.attributes));
// el: '#sportsManDetails',
template: _.template($('#sportsManDetailsTemplate').html()),
initialize: function(){
this.render();
},
events: {
'click .test': 'test'
},
test: function(){
alert('test');
},
render: function(){
// that does not work
//this.$el.html(this.template(this.model.attributes));
// is this good practice?
$('#sportsManDetails').html(this.$el.html(this.template(this.model.attributes)));
}
});
app.js
var sportsMen = [
{first: 'Quentin', last: 'Tarant', age: '34', sport: 'bike', category: '- 90kg'},
{first: 'Aymeric', last: 'McArthur', age: '54', sport: 'jetski', category: '200HP'},
{first: 'Peter', last: 'TheFat', age: '45', sport: 'curling', category: 'dunno'},
{first: 'Charles', last: 'Martel', age: '21', sport: 'Moto', category: 'MX 250cc'},
];
$(function(){
new app.NameListView(sportsMen);
});
Questo è veramente fantastico! Mi hai illuminato su questo argomento Grazie mille – Buzut
Nessun problema! Hai fatto una buona domanda che meritava una buona spiegazione. Buona fortuna per i tuoi viaggi Backbone! – ncksllvn
Non penso che sarà impeccabile, ma fa parte del gioco Grazie ancora :) – Buzut