Mam kolekcję kręgosłupa, która jest renderowana w tabeli. Chciałbym dokonać sortowania tabeli na podstawie pewnych atrybutów kolekcji, takich jak "task_status", "task_group". Czytałem dokumentację szkieletową o collection.comparator, nd collection.sort. Jak mogę to zrobić?sortuj kolekcję szkieletową na podstawie atrybutów modelu
Odpowiedz
Funkcja comparator
służy do porównywania dwóch modeli w kolekcji i może je porównywać w dowolny (spójny) sposób, jaki chce. W szczególności, może wybrać, który model przypisują używać tak można mieć coś takiego w swojej kolekcji:
initialize: function() {
this.sort_key = 'id';
},
comparator: function(a, b) {
// Assuming that the sort_key values can be compared with '>' and '<',
// modifying this to account for extra processing on the sort_key model
// attributes is fairly straight forward.
a = a.get(this.sort_key);
b = b.get(this.sort_key);
return a > b ? 1
: a < b ? -1
: 0;
}
a następnie wystarczy kilka metod na zbiorach zmienić sort_key
i nazywają sort
:
sort_by_thing: function() {
this.sort_key = 'thing';
this.sort();
}
W starszych kręgach, wywołanie sort
wyzwoli zdarzenie "reset"
, podczas gdy nowsze wersje wyzwolą zdarzenie "sort"
. Na pokrycie obu przypadkach można słuchać obu imprez i re-render:
// in the view...
initialize: function() {
this.collection.on('reset sort', this.render, this);
}
Demo: http://jsfiddle.net/ambiguous/7y9CC/
Można również użyć listenTo
zamiast on
aby pomóc uniknąć zombie:
initialize: function() {
this.listenTo(this.collection, 'reset sort', this.render);
}
@ Odpowiedź "mu-is-too-short" jest dobra, z wyjątkiem prostszego sposobu porównania pola wartości:
Najprostszym sposobem posortowania kolekcji na podstawie pola jest udostępnienie funkcji porównującej, która zwraca wartość tego pola, według którego chcesz sortować. Ten rodzaj komparatora powoduje, że Backbone wywołuje funkcję sortBy
, zamiast sort
, która następnie wykonuje to skomplikowane porównanie na własną rękę i nie musisz się martwić o logikę.
W gruncie rzeczy nie trzeba udostępniać złożonej funkcji porównawczej, chyba że istnieje bardziej zaawansowana potrzeba określenia zamówienia.
var myCollection = Backbone.Collection.extend({
sort_key: 'id', // default sort key
comparator: function(item) {
return item.get(this.sort_key);
},
sortByField: function(fieldName) {
this.sort_key = fieldName;
this.sort();
}
});
Po tym można po prostu zadzwonić kolekcji za sortByField
-function sznurkiem, który reprezentuje klawisz który chcesz sortować. Na przykład:
collection.sortByField('name');
Modified @ my-to-too-short demo: http://jsfiddle.net/NTez2/39/
Uwaga: ten przykład już nie działa, ponieważ kręgosłup nie uruchamia już zdarzenia resetowania podczas sortowania. Wystrzeliwuje zdarzenie sortowania. –
Dzięki za heads up! Zaktualizowałem przykład, aby uwzględnić tę zmianę: http://jsfiddle.net/NTez2/39/ – jylauril
Duży problem z pojedynczym komparatorem argumentów (i '_.sortBy') polega na tym, że nie można przełączać pomiędzy rosnącym i malejącym porządkiem na sznurku w dowolny rozsądny sposób. Zniżanie liczb jest łatwe, ponieważ możesz negować liczby, ale negowanie ciągu znaków nie jest takie łatwe. Nie można również sortować według kilku kluczy, bez zacierania ich w jeden ciąg i który dba o prawidłowe wykonanie. –
@ odpowiedź jylauril pomaga się ogromnie, ale potrzebne do modyfikacji demo (prawdopodobnie nieznaczne zmiany w szkielecie, ponieważ została wysłana ?)
Wygląda na to, że trzeba wyzwolić render po posortowaniu.
$('#by-s').click(function() {
c.sortByField('s');
v.render();
});
Updated @ demo My-is-too-short za: http://jsfiddle.net/NTez2/13/
- 1. Sortuj listę mieszanych ciągów na podstawie cyfr
- 2. Zmienić wartość modelu na podstawie innych wartości?
- 3. Java: Sortuj kolekcję za pomocą przycisku CollatorKey
- 4. Jak mogę dynamicznie ustawić nazwę klasy dla widoku Backbone.js na podstawie jego atrybutów modelu?
- 5. AngularJs: Dodaj klasę na podstawie modelu
- 6. kątowe-meteor znaleźć kolekcję MongoDB i powrotu na podstawie params
- 7. Szkielet - Można uzyskać kolekcję z modelu
- 8. Sortuj 2 listy w Pythonie na podstawie proporcji poszczególnych odpowiednich elementów lub na podstawie trzeciej listy
- 9. Sortuj posortowaną tablicę obiektów na podstawie rosnącej kolejności innego atrybutu.
- 10. Sortuj plik rozdzielany tabulatorami na podstawie polecenia sortowania kolumnowego bash
- 11. sortuj tablicę zewnętrzną na podstawie wartości w wewnętrznej tablicy, javascript
- 12. Jak umieścić kolekcję wewnątrz modelu w Backbone.js?
- 13. Jak utworzyć kolekcję szkieletową z wywołania interfejsu JSON API, które zwraca parametry główne, a także tablicę
- 14. Marklogic kwerendy na podstawie wartości wielu atrybutów tego samego pierwiastka
- 15. Jak dynamicznie zmieniać kolejność stron xslt na podstawie atrybutów węzła?
- 16. Generowanie unikalnego identyfikatora obiektu Pythona na podstawie jego atrybutów
- 17. Jak przechowywać i wyszukiwać dane na podstawie wielu atrybutów xml?
- 18. Pobieranie atrybutów schematu z modelu Mongoose
- 19. backbone.js zestaw atrybutów wewnętrznych modelu mieszania bezpośrednio
- 20. Jak wykryć zmiany atrybutów z modelu?
- 21. Klucze dynamiczne JBuildera dla atrybutów modelu
- 22. Uzyskiwanie określonych atrybutów z modelu ActiveRecord
- 23. Zapobiegaj dziedziczeniu atrybutów sprawdzania poprawności w modelu
- 24. Warunkowa zmiana img src na podstawie danych modelu
- 25. Pobierz wyniki modelu Laravel na podstawie wielu ID
- 26. Prepopulowanie rzędów na podstawie modelu nadrzędnego w Django Admin
- 27. Jak uzyskać kolekcję błędów stanu modelu w środowisku ASP.NET MVC?
- 28. Jak przekształcić kolekcję Scala opcji [X] na kolekcję X
- 29. Jak dodać "Sortuj według" podczas ładowania modelu Magento
- 30. Sortuj puste wpisy na dole zapytania LINQ
mogę wykorzystać ten wzór w sytuacji, w której pola sortowania są ciągi – MrFoh
@MrFoh: Tak, '>' i '<' praca w łańcuchach atrybut 's' w wersji demonstracyjnej jest łańcuchem znaków. –
Uwaga: ten przykład już nie działa, ponieważ Backbone nie uruchamia już zdarzenia resetowania podczas sortowania. Wystrzeliwuje zdarzenie sortowania. –