C'è un modo semplice per inserire un nuovo elemento del modello nel mezzo di un backbone.js Collection
e quindi aggiornare la collezione View
per includere il nuovo elemento nella posizione corretta?Inserimento di un elemento in una raccolta backbone.js
Sto lavorando a un controllo per aggiungere/eliminare elementi da un elenco. Ogni elemento dell'elenco ha il proprio Model
e View
e io ho uno View
per l'intera collezione.
Ogni vista articolo ha un pulsante Duplicate
che clona il modello dell'articolo e lo inserisce nella raccolta nella posizione dell'indice sotto l'elemento su cui è stato fatto clic.
L'inserimento dell'elemento nella raccolta è stato semplice, ma non riesco a capire come aggiornare la vista di raccolta. Ho provato qualcosa di simile:
ListView = Backbone.View.extend({
el: '#list-rows',
initialize: function() {
_.bindAll(this);
this.collection = new Items();
this.collection.bind('add', this.addItem);
this.render();
},
render: function() {
this.collection.each(this.addItems);
return this;
},
addItem: function (item) {
var itemView = new ItemView({ model: item }),
rendered = itemView.render().el,
index = this.collection.indexOf(item),
rows = $('.item-row');
if (rows.length > 1) {
$(rows[index - 1]).after(rendered);
} else {
this.$el.append(rendered);
}
}
}
Questa implementazione è una sorta di opera, ma sto ottenendo strani insetti quando aggiungo un nuovo elemento. Sono sicuro di poterli ordinare, ma ...
C'è una voce nella mia testa che continua a dirmi che c'è un modo migliore per farlo. Dover determinare manualmente dove inserire un nuovo ItemView
sembra davvero hacky - la vista della raccolta non dovrebbe sapere come eseguire il rerender della raccolta?
Qualche suggerimento?
Ho dovuto aggiungere una chiamata a '(.item-row) .remove()' nel metodo 'render' per farlo funzionare, ma è una buona soluzione. (Altrimenti gli oggetti rerender sono stati aggiunti alla fine degli oggetti renderizzati esistenti.) Grazie per l'aiuto! –
Oh, puoi semplicemente fare 'this. $ El.empty()' per cancellare '$ el' prima di passare alla raccolta :) – sntran
Questo è esattamente il modo in cui sto aggiungendo elementi alla raccolta al momento. Sta mettendo il nuovo oggetto nel punto giusto della collezione.Ho notato che ho un paio di refusi nel mio commento sopra: sto chiamando '$ ('. Item-row'). Remove()' per cancellare gli elementi che sono stati creati l'ultima volta che la raccolta è stata renderizzata. Sta semplicemente ripristinando la vista. Vieni a pensarci, c'è un metodo 'reset' che potrebbe fare ciò che voglio. Proverò a chiamarlo e poi a chiamare 'render'. –