Mam proste pytanie dotyczące funkcji pobierania i ustawiania Backbone.js .
1) Za pomocą poniższego kodu, w jaki sposób mogę bezpośrednio „pobrać” lub „ustawić” obj1.myAttribute1?
Inne pytanie:
2) W modelu, oprócz obiektu defaults , gdzie mogę / powinienem zadeklarować inne atrybuty mojego modelu, tak aby można było uzyskać do nich dostęp za pośrednictwem metod get and set Backbone?
var MyModel = Backbone.Model.extend({
defaults: {
obj1 : {
"myAttribute1" : false,
"myAttribute2" : true,
}
}
})
var MyView = Backbone.View.extend({
myFunc: function(){
console.log(this.model.get("obj1"));
//returns the obj1 object
//but how do I get obj1.myAttribute1 directly so that it returns false?
}
});
Wiem, że potrafię:
this.model.get("obj1").myAttribute1;
ale czy to dobra praktyka?
javascript
backbone.js
backbone-model
fortuneRice
źródło
źródło
defaults
określasz obiekt (cokolwiek przekazanego przez odniesienie) w (w tym przypadku obj1), ten sam obiekt będzie współdzielony we wszystkich instancjach modelu. Obecna praktyka polega na definiowaniudefaults
jako funkcji, która zwraca obiekt, który ma być użyty jako domyślny. backbonejs.org/#Model-defaults (patrz notatka zapisana kursywą)Odpowiedzi:
Chociaż
this.model.get("obj1").myAttribute1
jest w porządku, jest to trochę problematyczne, ponieważ wtedy możesz ulec pokusie zrobienia tego samego rodzaju dla zestawu, tj.Ale jeśli to zrobisz, nie uzyskasz korzyści z modeli Backbone
myAttribute1
, takich jak zdarzenia zmian lub walidacja.Lepszym rozwiązaniem byłoby nigdy nie zagnieżdżać POJSO („zwykłych starych obiektów JavaScript”) w modelach, a zamiast tego zagnieżdżać niestandardowe klasy modeli. Więc wyglądałoby to mniej więcej tak:
Wtedy byłby kod dostępu
ale co ważniejsze, kod ustawień byłby
które wywołają odpowiednie zmiany i tym podobne. Przykład roboczy tutaj: http://jsfiddle.net/g3U7j/
źródło
Uncaught TypeError: Object #<Object> has no method 'set'
Backbone.Model
, a następnie zacznij robić magiczne wydarzenie.Stworzyłem w tym celu model szkieletowy - po prostu rozszerz Backbone.DeepModel zamiast Backbone.Model, a następnie możesz użyć ścieżek do pobrania / ustawienia atrybutów zagnieżdżonych modeli. Utrzymuje również zmiany.
źródło
//You can use index notation to fetch from arrays console.log(model.get('otherSpies.0.name')) //'Lana'
Rozwiązanie Domenic będzie działać, jednak każdy nowy MyModel będzie wskazywał na tę samą instancję Obj. Aby tego uniknąć, MyModel powinien wyglądać następująco:
Zobacz odpowiedź c3rin @ https://stackoverflow.com/a/6364480/1072653, aby uzyskać pełne wyjaśnienie.
źródło
Używam tego podejścia.
Jeśli masz taki model Backbone:
Możesz ustawić atrybut „ab” za pomocą:
Teraz twój model będzie miał takie atrybuty, jak:
z uruchomionym zdarzeniem „zmiana”.
źródło
meta2= m.get('x'); meta2.id=110; m.set('x', meta2)
. Nie wywołuje to dla mnie żadnego zdarzenia zmiany :(_.clone(m.get('x'))
. dziękisetting
z obiektem, w którym się znajdujeszgetting
w określonym czasie. Więc jeśli nie sklonujesz dwóch obiektów, to dwa porównywane obiekty będą dokładnie takie same w ustalonym czasie.Jest jedno rozwiązanie, o którym nikt jeszcze nie pomyślał, które jest bardzo przydatne. Rzeczywiście nie możesz bezpośrednio ustawić zagnieżdżonych atrybutów, chyba że używasz biblioteki innej firmy, której prawdopodobnie nie chcesz. Możesz jednak zrobić klon oryginalnego słownika, ustawić tam zagnieżdżoną właściwość, a następnie ustawić cały słownik. Bułka z masłem.
źródło
Miałem ten sam problem @pagewil i @Benno z rozwiązaniem @ Domenic. Moją odpowiedzią było napisanie zamiast tego prostej podklasy Backbone.Model, która rozwiązuje problem.
To, co robi dla Ciebie NestedModel, to pozwala im działać (co dzieje się, gdy myModel jest ustawiany za pomocą danych JSON):
Łatwo byłoby wygenerować listę modeli automatycznie podczas inicjalizacji, ale to rozwiązanie było dla mnie wystarczająco dobre.
źródło
Rozwiązanie zaproponowane przez Domenic ma pewne wady. Powiedz, że chcesz słuchać zdarzenia „zmiana”. W takim przypadku metoda „initialize” nie zostanie uruchomiona, a niestandardowa wartość atrybutu zostanie zastąpiona obiektem json z serwera. W moim projekcie zmierzyłem się z tym problemem. Moje rozwiązanie zastępowania metody „ustawiania” Modelu:
źródło
Chociaż w niektórych przypadkach używanie modeli Backbone zamiast zagnieżdżonych atrybutów Object ma sens, jak wspomniał Domenic, w prostszych przypadkach można utworzyć funkcję ustawiającą w modelu:
źródło
Jeśli wchodzisz w interakcję z backendem, który wymaga obiektu ze strukturą zagnieżdżenia. Ale z kręgosłupem łatwiej jest pracować ze strukturą liniową.
backbone.linear może Ci pomóc.
źródło