Kilka miejsc w mojej aplikacji szkieletowej Chciałbym mieć natychmiastowe przeszukanie kolekcji, ale trudno mi wymyślić najlepszy sposób implementacji to.Backbone.js - najlepsza praktyka w implementacji "natychmiastowego" wyszukiwania
Oto szybka implementacja. http://jsfiddle.net/7YgeE/ Należy pamiętać, że moja kolekcja może zawierać ponad 200 modeli.
var CollectionView = Backbone.View.extend({
template: $('#template').html(),
initialize: function() {
this.collection = new Backbone.Collection([
{ first: 'John', last: 'Doe' },
{ first: 'Mary', last: 'Jane' },
{ first: 'Billy', last: 'Bob' },
{ first: 'Dexter', last: 'Morgan' },
{ first: 'Walter', last: 'White' },
{ first: 'Billy', last: 'Bobby' }
]);
this.collection.on('add', this.addOne, this);
this.render();
},
events: {
'keyup .search': 'search',
},
// Returns array subset of models that match search.
search: function(e) {
var search = this.$('.search').val().toLowerCase();
this.$('tbody').empty(); // is this creating ghost views?
_.each(this.collection.filter(function(model) {
return _.some(
model.values(),
function(value) {
return ~value.toLowerCase().indexOf(search);
});
}), $.proxy(this.addOne, this));
},
addOne: function(model) {
var view = new RowView({ model: model });
this.$('tbody').append(view.render().el);
},
render: function() {
$('#insert').replaceWith(this.$el.html(this.template));
this.collection.each(this.addOne, this);
}
});
i mały widok dla każdego modelu ...
var RowView = Backbone.View.extend({
tagName: 'tr',
events: {
'click': 'click'
},
click: function() {
// Set element to active
this.$el.addClass('selected').siblings().removeClass('selected');
// Some detail view will listen for this.
App.trigger('model:view', this.model);
},
render: function() {
this.$el.html('<td>' + this.model.get('first') + '</td><td>' + this.model.get('last') + '</td>');
return this;
}
});
new CollectionView;
Pytanie 1
Na każdym keydown, filtrować kolekcję, opróżnić tbody
i uczynienia wyniki, tworząc w ten sposób nowy widok dla każdego modelu. Właśnie stworzyłem widoki duchów, tak? Czy najlepiej zniszczyć każdy widok? A może powinienem spróbować zarządzać moim RowView
s ... tworząc każdy z nich tylko jeden raz i przechodząc przez nie, aby renderować tylko wyniki? Może tablica w moim CollectionView
? Po opróżnieniu tbody
, czy RowViews
nadal będzie miał ich el
, czy jest teraz pusty i wymaga ponownego renderowania?
Pytanie 2, Wybór modelu
Zauważysz Jestem wyzwalania zdarzenia niestandardowego w moim RowView
. Chciałbym mieć gdzieś widok szczegółów, aby obsłużyć to zdarzenie i wyświetlić cały mój model. Gdy przeszukuję moją listę, jeśli wybrany przeze mnie model pozostanie w wynikach wyszukiwania, chcę zachować ten stan i pozostawić go w widoku szczegółów. Gdy nie będzie już w moich wynikach, opróżnię widok szczegółów. Więc na pewno będę musiał zarządzać szeregiem widoków, prawda? Rozważałem podwójnie połączoną strukturę, w której każdy widok wskazuje na jej model, a każdy model na jego widok ... ale jeśli mam w przyszłości zaimplementować singletonową fabrykę w moich modelach, nie mogę tego narzucić Model. :/
Jaki jest najlepszy sposób zarządzania tymi widokami?
Dziękuję, to jest niezwykle pomocne. Naprawdę podoba mi się to, co zrobiłeś z filtrem. W moich wczesnych próbach miałem również zakres, ale był mocno zakodowany i jakoś pominął funkcję "pick" w dokumentach. Ponadto, nigdy nie wiedział o funkcji "przepustnicy", również bardzo pomocne. –
Nadal pakuję głowę wokół sposobu, w jaki renderowane są rzeczy, i nie jestem całkiem sprzedany przy użyciu 'setElement'. Wydaje mi się niecelowe powtarzanie zdarzeń na każdym renderowaniu. Nigdy nie widziałem tej techniki szczepienia, w której renderujesz elementy listy w CollectionView i graft w ItemViews ... Nie jestem przyzwyczajony do tego, że ItemView nie jest odpowiedzialny za renderowanie się, a z jednej strony wydaje się separacją Obawy, które nie powinny pojawić się, ale z drugiej strony są zaskakująco proste, ponieważ zawsze łatwiej jest zmienić szablon na nasze kolekcje. –
@savinger 'setElement' jest przeważnie z powodów kosmetycznych i dla" samodzielności "szablonów, technika ta byłaby bardziej przydatna, gdybyś musiał na przykład powtórzyć wiersze. Ta odpowiedź może pomóc w zrozumieniu mojego punktu widzenia: http://stackoverflow.com/questions/12004534/backbonejs-rendering-problems/12006179#12006179 – nikoshr