TL; DR: Jeśli wybieram całą kolekcję modeli z serwera, jak scalić zmienione atrybuty w każdym modelu i dodać/usunąć dodane/usunięte modele z kolekcji ?Scalenie kolekcji kręgosłupa z odpowiedzią serwera
W mojej aplikacji szkieletowej wybieram dla całej kolekcji modeli. Mam Backbone.Collection
, że jestem po prostu dzwoniąc reset
w każdym czasie pojawia się szereg modeli, więc:
myCollection.reset(server_response);
Jedyny problem polega na tym, że pozbywa się starych modeli, rodzaj eliminacji korzyści wydarzenia na modelu. Jest to oczywiście cel z zakresu reset
, ale chcę tylko zmodyfikować zmienione atrybuty modeli i usunąć modele spoza zakresu odpowiedzi, a także dodać modele, które były w odpowiedzi, ale nie kolekcje.
Zasadniczo chcę pewnego rodzaju scalić danych.
Dla modeli, które znajdują się w odpowiedzi i już kolekcji, wierzę, że mogę po prostu zrobić model.set(attributes)
i dba o set
ing tylko te, które naprawdę się zmieniły, wyzwalając change
wydarzeń w tym procesie. To jest świetne.
Ale jak obsługiwać przypadki, w których modele były w odpowiedzi, ale już nie w kolekcji, i na odwrót, nie w odpowiedzi, ale w kolekcji?
My Proponowane rozwiązanie
ja nie wiem, czy kręgosłup ma już sposób to zrobić, a ja może być overcomplicating dlatego pytam, ale myślał wtedy o stworzeniu metody na mojej kolekcji, która przechodzi server_response
.
Otrzyma wszystkie atrybuty z server_response
i wszystkie atrybuty id
modeli już w kolekcji.
Różnica w odpowiedziach na id
- kolekcja = modele dodane i na odwrót zostaną usunięte modele. Dodaj i usuń te modele odpowiednio z kolekcji.
Przecięcie obu zestawów id
jest zmodyfikowanymi modelami, dlatego należy wykonać iterację poprzez te id
i po prostu wykonać collection.get(id).set(attributes)
.
W pseudocoffeescript:
merge: (server_response) =>
response_ids = _.pluck(server_response, 'id')
collection_ids = @pluck('id')
added = _.difference(response_ids, collection_ids)
for add in added
@add(_.find(server_response, (model) ->
return model.id == add
))
removed = _.difference(collection_ids, response_ids)
for remove in removed
@remove(@get(remove))
changed = _.intersection(response_ids, collection_ids)
for change in changed
@get(change).set(_.find(server_response, (model) ->
return model.id == change
))
*> W pseudocoffeescript: * O Boże. –
To właściwie coffeescript, miałem na myśli pseudo, ponieważ nie przetestowałem go jeszcze haha. –