2011-12-21 16 views
35

Czy istnieje sposób na łatwe klonowanie kolekcji kręgosłupa? Zastanawiam się, dlaczego nie ma metody kompilacji, jak w przypadku modeli. Mój problem polega na tym, że mam model trzymający kolekcję dziecięcych. Kiedy sklonuję model. Wciąż mam kolekcję dzieci, ale tylko z ich wartościami domyślnymi.Jak sklonować kolekcję kręgosłupa

Odpowiedz

13

Jaki jest twój przypadek użycia, aby sklonować kolekcję?

Nie ma wbudowanej funkcji klonowania dla kolekcji, ponieważ nie chcesz klonować modeli w kolekcji. Klonowanie modelu spowodowałoby, że istnieją dwa oddzielne wystąpienia tego samego modelu, a jeśli zaktualizujesz jeden model, drugi nie zostanie zaktualizowany.

Jeśli chcesz utworzyć nową kolekcję w oparciu o określone kryteria, możesz użyć metody filtru kolekcji.

var freshmenModels = studentsCollection.filter(function(student) { 
    return student.get('Year') === 'Freshman'; 
} 

var freshmenCollection = new Backbone.Collection(freshmenModels); 

iść do przodu i sklonować modeli w kolekcji, można napisać następujący kod

var clonedCollection = new Backbone.Collection(); 
studentsCollection.each(function(studentModel) { 
    clonedCollection.add(new Backbone.Model(studentModel.toJSON())); 
}); 
+1

Ale chcę skopiować wszystkie pojedyncze modele w kolekcji. –

+0

Co próbujesz zrobić, aby skopiować/sklonować wszystkie modele z kolekcji? – Paul

+0

Mam kilka produktów, które mogą mieć listę produktów podrzędnych. Więc kiedy niektórzy wkładają je do koszyka, muszę skopiować wszystkie produkty podrzędne. Użytkownik może zmienić liczbę samych produktów i produktów podrzędnych. Potrzebuję kopii oryginału w koszu. –

4

Inną opcją, jeśli potrzebne są następujące (czego szukałem, kiedy znalazłem to pytanie;)):

  • kopia kolekcji powinny być tego samego typu co w oryginalnej kolekcji (np utworzeniu własnego typu kolekcji, która rozciąga Backbone.Collection)
  • Kopia kolekcji powinny być utworzone z tych samych opcji jak oryginalne
  • Modele w kopii zbiorów powinny być tworzone przy użyciu metody model.clone()

Kod:

var models = original.map(function (model) { return model.clone(); });  
var options = _.clone(original.options);  
var copy = new original.constructor(models, options); 

Ogólna metoda klonowania w grze Backbone.Collection byłaby niezręczna, ponieważ zawsze będą występować subtelności wokół tego, czy modele i ich zagnieżdżone obiekty będą kopiowane przez odniesienie, czy też same zostaną sklonowane. Wymagania będą bardzo różne w zależności od scenariusza, więc pozostało ci napisanie tego, czego potrzebujesz.

59

Najprostszy sposób:

var cloned = new Backbone.Collection(original.toJSON()); 

gdzie original jest kolekcja sklonować.

Zawsze można wtedy rozszerzyć moduł Backbone o numer Collection, aby dodać obsługę klonowania w lub bez obsługi dziedziczenia w/o.

+2

To jest świetna odpowiedź, ponieważ wykona głęboki klon, co oznacza, że ​​będzie klonować również modele. Jeśli wolisz płytki klon, w którym nowa kolekcja wskaże te same egzemplarze modelu, skorzystaj z poniższej odpowiedzi Craiga Mylesa. – Dre

+0

Nie przydatne, gdy modele mają metody – OlehZiniak

7

Użyj metody Backbone Collection clone():

var clonedCollection = myCollection.clone(); 
+1

Klonuje link kolekcji, więc zmiany w myCollection będą następowały zmiany w clonedCollection –