Otrzymałem następujący kod JSON z serwera. W tym celu chcę utworzyć model z modelem zagnieżdżonym. Nie jestem pewien, w jaki sposób można to osiągnąć.
//json
[{
name : "example",
layout : {
x : 100,
y : 100,
}
}]
Chcę, aby zostały one przekonwertowane na dwa zagnieżdżone modele szkieletowe o następującej strukturze:
// structure
Image
Layout
...
Dlatego definiuję model układu w następujący sposób:
var Layout = Backbone.Model.extend({});
Ale której z dwóch (jeśli w ogóle) poniższych technik powinienem użyć do zdefiniowania modelu obrazu? A czy B poniżej?
ZA
var Image = Backbone.Model.extend({
initialize: function() {
this.set({ 'layout' : new Layout(this.get('layout')) })
}
});
lub B.
var Image = Backbone.Model.extend({
initialize: function() {
this.layout = new Layout( this.get('layout') );
}
});
define(['modelFile'], function(MyModel){... do something with MyModel})
Ale masz rację. Mam w zwyczaju odwoływać się do modelu według zaproponowanej przez Ciebie konwencji.Backbone.Model.prototype.parse
funkcji. Następnie wszystkie modele muszą zrobić, aby zdefiniować typy obiektów podmodelu (w atrybucie „model”).Publikuję ten kod jako przykład sugestii Petera Lyona, aby przedefiniować parsowanie. Miałem to samo pytanie i to zadziałało (z backendem Railsów). Ten kod jest napisany w Coffeescript. Wyraźnie przedstawiłem kilka rzeczy osobom, które go nie znają.
lub w JS
źródło
Użyj
Backbone.AssociatedModel
z asocjacji Backbone :źródło
Nie jestem pewien, czy sam Backbone ma zalecany sposób, aby to zrobić. Czy obiekt układu ma własny identyfikator i rekord w wewnętrznej bazie danych? Jeśli tak, możesz zrobić z niego swój własny Model, tak jak masz. Jeśli nie, możesz po prostu pozostawić go jako zagnieżdżony dokument, po prostu upewnij się, że konwertujesz go na format JSON iz niego poprawnie w metodach
save
iparse
. Jeśli ostatecznie podejmiesz takie podejście, myślę, że Twój przykład A jest bardziej spójny z kręgosłupem, ponieważset
zostanie poprawnie zaktualizowanyattributes
, ale znowu nie jestem pewien, co Backbone robi domyślnie z modelami zagnieżdżonymi. Prawdopodobnie będziesz potrzebować niestandardowego kodu, aby to obsłużyć.źródło
new
operatora. Edytowałem go, aby naprawić ten błąd.Wybrałbym opcję B, jeśli chcesz, aby wszystko było proste.
Inną dobrą opcją byłoby użycie Backbone-Relational . Po prostu zdefiniowałbyś coś takiego:
źródło
Używam wtyczki Backbone DeepModel do zagnieżdżonych modeli i atrybutów.
https://github.com/powmedia/backbone-deep-model
Możesz powiązać się, aby zmienić wydarzenia na głębokich poziomach. na przykład:
model.on('change:example.nestedmodel.attribute', this.myFunction);
źródło
Wersja CoffeeScript pięknej odpowiedzi rycfung :
Czy to nie słodkie? ;)
źródło
Miałem ten sam problem i eksperymentowałem z kodem w odpowiedzi rycfung , co jest świetną sugestią.
Jeśli jednak nie chcesz
set
bezpośrednio zagnieżdżać modeli lub nie chcesz ciągle przekazywać{parse: true}
ichoptions
, innym podejściem byłoby przedefiniowanieset
siebie.W Backbone 1.0.0 ,
set
nazywa sięconstructor
,unset
,clear
,fetch
isave
.Rozważ następujący super model dla wszystkich modeli, które muszą zagnieżdżać modele i / lub kolekcje.
Zauważ, że
model
,_setModel
i_unsetModel
są pozostawione puste celowo. Na tym poziomie abstrakcji prawdopodobnie nie możesz zdefiniować żadnych rozsądnych działań dla wywołań zwrotnych. Możesz jednak chcieć zastąpić je w podmodelach, które rozszerzająCompoundModel
.Te wywołania zwrotne są przydatne, na przykład, do wiązania detektorów i propagowania
change
zdarzeń.Przykład:
Dzięki temu masz automatyczne tworzenie zagnieżdżonych modeli i propagację zdarzeń. Przykładowe użycie jest również dostarczane i testowane:
Wynik:
źródło
Zdaję sobie sprawę, że spóźniłem się na tę imprezę, ale niedawno wydaliśmy wtyczkę, aby poradzić sobie dokładnie z tym scenariuszem. Nazywa się to backbone-nestify .
Więc twój zagnieżdżony model pozostaje niezmieniony:
var Layout = Backbone.Model.extend({...});
Następnie użyj wtyczki podczas definiowania modelu zawierającego (za pomocą Underscore.extend ):
Następnie, zakładając, że masz model,
m
który jest instancjąImage
i ustawiłeś JSON z pytaniam
, możesz wykonać:źródło
Używaj form szkieletowych
Obsługuje zagnieżdżone formularze, modele i toJSON. WSZYSTKO ZAGNIEŻDŻONE
źródło
Jeśli nie chcesz, aby dodać kolejną ramy, można rozważyć utworzenie klasy bazowej z przesłonięte
set
itoJSON
i używać go tak:Będziesz potrzebować
BaseModel
tej odpowiedzi (dostępnej, jeśli chcesz, jako streszczenie ).źródło
My też mamy ten problem, a pracownik zespołu zaimplementował wtyczkę o nazwie backbone-nested-attributes.
Użycie jest bardzo proste. Przykład:
Dzięki temu model Tree może uzyskać dostęp do owoców:
Więcej informacji można znaleźć tutaj:
https://github.com/dtmtec/backbone-nested-attributes
źródło