2013-08-17 23 views
7

Podobne pytania -Best Practice do przenoszenia modelu szkieletowej w kolekcji

BackboneJS best way to rearrange models in a collection while maintaining 0-indexed ordinal property for each model

How can I move a model within a collection?

Mam kolekcję kręgosłup, reprezentowane wizualnie na liście. Ta lista jest drag/droppable. Każdy przedmiot może zostać przesunięty do dowolnej pozycji w kolekcji (tzn. - nie sortować). Widziałem kilka przykładów, które wykorzystują natywne usuwanie/dodawanie kolekcji, aby umieścić model we właściwym miejscu. Jednak Backbone wewnętrznie wywołuje ustawienie po dodaniu modeli, które następnie wywołuje grupę metod związanych ze zdarzeniami i sortuje je na końcu. Czy istnieje jakaś wada polegająca na tym, że model jest po prostu składany do prawidłowej pozycji?

Usuń/Dodaj: Zobacz przykłady z pierwszego połączonego pytania.

Splice: Drugi przykład

Funkcja obecnie używam:

moveTo: function(oldIndex, newIndex){ 
     oldIndex = oldIndex instanceof Backbone.Model ? this.at(oldIndex) : oldIndex; 
     var spliced = this.models.splice(oldIndex, 1); 
     this.models.splice(newIndex, 0, spliced[0]); 
     this.trigger("move",[oldIndex,newIndex]); 
    }, 
+3

Czy jesteś pewien, że to nie jest rodzaj? Drag'n'drop, aby przenosić obiekty, ręcznie zmienia indeksy elementów, a tablica/kolekcja jest mniej więcej sortowana według indeksu. –

+0

Domyślam się, że "technicznie" można to nazwać pewnym, po prostu chodziło o to, że jest arbitralny, a nie automatyczny oparty na właściwościach tablicy. Ale myślę, że zwracasz uwagę, że jest to odpowiednik "sortowania", ponieważ obie zmieniają tylko elementy, a tym samym Backbone nie ma z tym problemów. – iabw

+0

Moje pytanie może być lepiej wyrażone jako "Czy istnieje sytuacja, w której chcesz usunąć i ponownie dodać modele do kolekcji, zamiast ręcznie je" sortować "?" ;) – iabw

Odpowiedz

11

pisałem to rozwiązanie dla mojego najnowszego projektu. Wygląda na podobny interfejs do tego, co opisałeś - lista do sortowania. Ta metoda jest powiązana z kolekcją.

reorder: function(new_index, original_index) { 
    // If nothing is being changed, don't bother 
    if (new_index === original_index) return this; 
    // Get the model being moved 
    var temp = collection.at(original_index); 
    // Remove it 
    collection.remove(temp); 
    // Add it back in at the new index 
    collection.add(temp, { at: new_index }); 
    return this; 
} 

Większość mojego własnego kodu została usunięta, ale jest to podstawowa funkcjonalność. Opcja Backbone's at czyni to naprawdę łatwym.

+2

Możesz wyciszyć wywołania 'remove' i' add', aby zapobiec niechcianym zmianom w widokach odsłuchiwanych przez kolekcję i modeli wewnątrz niej. Możesz również utworzyć własne zdarzenie 'move', aby pozwolić słuchaczom odpowiednio zareagować. –