2013-01-23 30 views
5

Podczas zabawy z emberem stwierdziłem, że czasami model jest przechowywany we właściwości kontrolera content, czasami model jest również dostępny bezpośrednio na kontrolerze. Nie rozumiem jednak, kiedy tak się dzieje.Uzyskiwanie dostępu do modelu z szablonu

Pozwolę sobie wyjaśnić to na przykładzie, który znalazłem podczas montażu mojego MVC.

Konfiguracja A - początek

  • I zdefiniowano niestandardowy Member obiekt, odpowiadający MemberRoute, MemberView klas i szablon z nazwą member.
  • Przedmiotem Member miał pewne atrybuty, takie jak id, nickname itp
  • UWAGA: Nr kontroler formularza MemberController zostało zdefiniowane, co umownie Ember za to zapewnia regulator na własną rękę.

Konfiguracja B - Dostosowanie

  • samo jak skonfigurować, ale teraz jest MemberController określono, że zawiera kilka metod działania, które są uruchamiane z poziomu szablonu.

Dziwne zachowanie (odp., Czego nie całkowicie zrozumieć)

  • w konfiguracji A, mogę odnieść się do Member „s atrybutów bezpośrednio z {{id}} lub {{nickname}}.
  • w konfiguracji B, muszę używać {{content.id}} lub {{content.nickname}}

Jak udokumentowane w dokumentacji Ember, w MemberView robi

setupController : function(controller, member) { 
    controller.set('content', member); 
}, 

Więc może ktoś mi pomóc zrozumieć, dlaczego różnica i gdzie różnica jest? Obecnie moje przypuszczenie byłoby albo

  • że kontekst szablonu jest inny (być może tam jest kawałek kodu brakuje w konfiguracji kontrolera?)

lub

  • domyślny kontroler dostarczany przez ember automatycznie ma dodatkową magię, która nie jest bezpośrednio dostępna dla niestandardowych kontrolerów.

Każda pomoc w zrozumieniu tego jest bardzo cenna. Minęło już sporo czasu, zanim doszedłem tak daleko. Najpierw pomyślałem, że może to być modularyzacja wprowadzona przez konfigurację projektu z requireJS (cóż, nadal uważam, że może mieć wpływ). Ember jest w wersji 1.0pre4.

Z góry dziękuję! Patrick

Odpowiedz

8

Czy ktoś mógłby mi pomóc zrozumieć, dlaczego różnica i gdzie jest różnica? Obecnie przypuszczam, że jest to albo , że kontekst szablonu jest inny (być może brakuje fragmentu kodu w konfiguracji kontrolera?) lub domyślny kontroler dostarczany przez ember automatycznie, ma dodatkową magię nie jest bezpośrednio dostępny dla niestandardowych kontrolerów.

Trudno powiedzieć na pewno, nie widząc swój kod, ale mój najlepszy przypuszczenie, że MemberController rozciąga Ember.Controller. Wartością domyślną dostarczaną przez ember (w tym scenariuszu) byłby Ember.ObjectController. Jeśli to, co chcesz zmienić swoją definicję MemberController do:

App.MemberController = Ember.ObjectController.extend({ 
    myProperty: 'value' 
}); 

objectController działa jako proxy do jego content nieruchomość, zazwyczaj jest to model Ember. Więc jeśli rzeczy są poprawnie podłączone, nigdy nie powinieneś potrzebować dostępu do modelu poprzez właściwość "content". Jeśli kiedykolwiek zobaczysz coś takiego:

{{content.id}} or {{content.nickname}} 

to znak, że powinieneś zmienić na ObjectController. Zobacz EMBER GUIDES: REPRESENTING A SINGLE MODEL! dla bardziej szczegółowego wyjaśnienia.

+0

doskonały, dzięki Michael. To nie jest tylko wyjaśnienie, ale co było nie tak w moim kodzie. Miałem 'App.MemberController = Ember.Controller.extend ({});'. Przynajmniej błąd pozwolił na lepsze zrozumienie kontrolerów. jeszcze raz! ph –

0

an ObjectController działa jako proxy dla obiektu ustawionego na zawartość kontrolera. Jeśli żaden kontroler nie zostanie zdefiniowany, Ember utworzy dla ciebie kontroler i domyślnie ustawi jego zawartość na dowolny obiekt zwracany przez trasę model() function, jeśli jest zdefiniowany. Zachowanie powinno być takie samo, niezależnie od tego, czy zdefiniujesz własny kontroler, czy pozwolisz Emberowi zdefiniować go dla siebie. Domyślnym kontekstem w szablonie jest sam kontroler, tj. this = an instance of your controller or the generated one. Kiedy próbujesz uzyskać dostęp do pseudonimu w tym kontekście, Ember najpierw spróbuje go rozwiązać przeciwko samemu kontrolerowi i jeśli nic nie zostanie znalezione, rozpatruje je względem jego zawartości, tj. Obiektu, jeśli ręcznie ustawiłeś go na zawartość kontrolera.

Na koniec nie ma domyślnej implementacji model() function na trasie z wyjątkiem sytuacji, gdy korzystasz z dynamicznych adresów URL, say /foo/id that resolves against /foo/:id, Ember używa podanego identyfikatora, aby załadować obiekt Foo z podanym identyfikatorem, zapewniając w ten sposób domyślną implementację do funkcja model(). Na końcu sprowadza się do tego samego mechanizmu, tylko zautomatyzowanego dla twojej wygody.

Sugeruję, aby posłuchać this, aby uzyskać więcej informacji na temat tego, jak rzeczy są zautomatyzowane przez Ember. Ale jeśli chodzi o wyświetlaną treść, nie ma magii, którą trzeba ręcznie podłączyć do kontrolera.

+0

jak już zaznaczono, Michael naprawdę miał rację. Ale dzięki za wyjaśnienia i link do interesującej rozmowy. –

Powiązane problemy