ExtJS - Jak korzystać z Proxy, Model? W jaki sposób są spokrewnieni?

Próbowałem nauczyć się pracować z modelami i sklepami. Ale trochę proxy mnie myli. Więc zamierzam wymienić moje zrozumienie tutaj-proszę wskazać luki w moim zrozumieniu.

Moje zrozumienie

  1. modele są używane do reprezentowania obiektów domeny.
  2. modele mogą być tworzone przez ModelManager lub po prostu za pomocą konstruktora
  3. modele są zapisywane w sklepach
  4. sklepy mogą znajdować się w sklepach pamięci lub mogą być sklepami serwerowymi. To jest skonfigurowany za pomocą serwera Proxy.
  5. Proxy mówi sklepowi, Jak rozmawiać ze sklepem zapasowym - czy to array JSON, REST resource, czy po prostu skonfigurowany adres URL przez ajax.
  6. sklepy są odpowiedzialne za przechowywanie modeli, a proxy są odpowiedzialne za kontrolowanie / pomoc w tym zadaniu.
  7. gdy wartości modelu są zmieniane, jego znacznik dirty jest ustawiany. Zostanie automatycznie wyczyszczone po zapisaniu modelu. (więcej w dalszej części)

Część, która myli me

  1. dlaczego istnieje metoda proxy config i save w modelu? Rozumiem, że modele można przechowywać tylko w sklepach.
  2. dlaczego flaga dirty nie jest czyszczona po prostu, gdy dodaję obiekt modelu do sklepu?
  3. kiedy dodaję obiekt modelu do sklepu, dlaczego model nie nabywa serwera proxy skonfigurowanego w tym sklepie?
  4. proxy jest statyczną konfiguracją modelu. Czy to oznacza, że nie możemy używać obiektów określonego modelu z wieloma źródłami danych? Przez rozszerzenie, czy oznacza to posiadanie wielu sklepów dla jednego modelu zasadniczo bezużyteczne?
  5. kiedy definiujemy Store, czy definiujemy klasę (store-type, jeśli możemy to tak nazwać), czy jest to instancja sklepu? Powodem, dla którego pytam, jest to, że gdy deklarujemy siatkę, po prostu przekazujemy jej konfigurację sklepu jako store: 'MyApp.store.MyStore' - czy siatka tworzy instancję siatki tego typu, czy po prostu używa sklepu, który już utworzyliśmy?
Dzięki!

PS :+ 50 bounty to the osoba, która to wszystko wyjaśni:) - zaoferuje bounty po tych 48 godzinach..

Author: Molecular Man, 2011-09-13

3 answers

Docs mówią:

Model reprezentuje jakiś obiekt, którym zarządza Twoja aplikacja.

Sklep jest tylko zbiorem instancji modelowych-Zwykle ładowanych z serwera gdzieś.


Modele są zapisywane w sklepach

Nie tylko. Modele mogą być używane oddzielnie (np. do wypełniania formularzy danymi. Sprawdź Ext.forma.Panel.loadRecord Więcej informacji).

Dlaczego jest konfiguracja proxy i Zapisz metodę na modelu? Rozumiem, że modele można przechowywać tylko w sklepach.

Jak już mówiłem, nie tylko.

Dlaczego brudna flaga nie jest czyszczona po prostu, gdy dodaję obiekt modelu do sklepu?

Dlaczego? Rekord staje się czysty tylko wtedy, gdy zostanie zsynchronizowany z odpowiednim rekordem po stronie serwera.

Kiedy dodaję obiekt modelu do sklepu, dlaczego model nie nabywa proxy skonfigurowanego z tym sklep?

To znowu dlatego, że model może być używany bez sklepu.

Proxy jest statyczną konfiguracją modelu. Czy to oznacza, że nie możemy używać obiektów określonego modelu z wieloma źródłami danych?

Nie możemy używać obiektów określonego modelu, ale możemy użyć jednej definicji modelu dla wielu magazynów. Na przykład:

Ext.define('MyModel', {
  // ... config
});
var store1 = Ext.create('Ext.data.Store', {
  model: 'MyModel',
  // ... config
  proxy: {
    // ...
    // this proxy will be used when store1.sync() and store1.load() are called
  }
  // ...
});
// ...
var storeN = Ext.create('Ext.data.Store', {
  model: 'MyModel',
  // ... config
  proxy: {
    // ...
    // this proxy will be used when storeN.sync() and storeN.load() are called
  }
  // ...
});

Ponieważ store1 i storeN używają różnych proxy, rekordy zawarte w tych sklepach mogą być całkowicie inaczej.

Kiedy definiujemy Store, czy definiujemy klasę (store-type, jeśli możemy to tak nazwać), czy jest to instancja sklepu?

Tak, Kiedy definiujemy Sklep, definiujemy klasę.

Powodem, dla którego pytam, jest to, że gdy deklarujemy siatkę, po prostu przekazujemy jej konfigurację sklepu jako store: 'MyApp.sklep.MyStore ' - czy siatka tworzy instancję tego typu siatki, czy po prostu korzysta ze sklepu, który już utworzyliśmy?

Istnieje kilka sposób ustawienia store config dla siatki:

  1. store: existingStore,
  2. store: 'someStoresId',
  3. store: 'MyApp.store.MyStore',

W pierwszym i drugim przypadku używane byłyby istniejące instancje sklepów. W trzecim przypadku zostanie użyta nowo utworzona instancja 'MyApp.store.MyStore'. Zatem store: 'MyApp.store.MyStore', jest równe

  var myStore = Ext.create('MyApp.store.MyStore', {});
  // ... 
    // the following - is in a grid's config:
    store: myStore,

UPDATE


Kiedy model jest dodawany do sklepu, a następnie wywoływana jest funkcja Sync() sklepu, dlaczego flaga brudnego modelu nie jest czyszczona?

Powinno być wyczyszczone, chyba że reader, writer i odpowiedź serwera nie są skonfigurowane prawidłowo. Sprawdź writer przykład . Jest czyszczona automatycznie flaga dirty podczas Sync().


Jeśli Klasa modelu nie otrzymuje żadnego proxy, dlaczego śledzi swój brudny status?

Aby poinformować Cię, czy zapis został zmieniony od momentu utworzenia.


Co osiąga się poprzez wprowadzenie koncepcji modeli synchronizujących się z serwer?

Załóżmy, że tworzysz widżet, który zawiera zwykły zestaw wejść. Wartości dla tych wejść można wczytać z db(ten zestaw wejść przedstawia jeden wiersz w tabeli db). A gdy użytkownik zmieni wartości wejściowe dane powinny zostać przesłane do serwera. Dane te mogą być przechowywane w jednym rekordzie.

Więc czego byś użył do tego interfejsu: jednego rekordu czy sklepu z tylko jednym rekordem?

Standalone model - jest dla widżetów, które reprezentują jeden wiersz w tabeli db.
Store - jest dla widżetów, które reprezentują zestaw wierszy w tabeli db.

 19
Author: Molecular Man,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-15 07:15:19

[[4]}przechodzę z ExtJS 2.2 [sic] do 4, A zachowanie modelu i terminologia rzuciły mnie też na pętlę.

Najlepsze szybkie wyjaśnienie, jakie mogę znaleźć, pochodzi z tego postu z serii "Countdown to ExtJS 4" na blogu senchy. Okazuje się, że Model zachowuje się tak, ponieważ jest" naprawdę " płytą.

Centralnym elementem pakietu danych jest Ext.data.Model. Model reprezentuje pewien rodzaj danych w aplikacji - na przykład aplikacja e-commerce może mieć modele dla użytkowników, produktów i zamówień. Na najprostszy Model to tylko zbiór pól i ich danych. Anyone znajomy z Ext JS 3 będzie używał Ext.data.Rekord, który był prekursor wew.data.Model.

Oto część myląca: Model jest zarówno modelem dla danych, których używasz , jak i pojedynczą instancją obiektu podążającego za tym modelem. nazwijmy jego dwa zastosowania " Model qua model "i" Model qua Rekord".

Dlatego jej Metoda load wymaga unikalnego identyfikatora (kropka). Model qua Record używa tego identyfikatora do tworzenia RESTful URL do pobierania (i zapisywania itp.) pojedynczego rekordu wartości danych. Konwencja RESTful URL jest opisana tutaj i jest połączona z tym postem na blogu Sencha, który mówi konkretnie o użyciu modelu.

Oto kilka RESTful Url utworzonych zgodnie z tym standardem, aby zapoznać się z formatem, który to wygląda na to, że model ExtJS używa:

Operować na rekordzie o id 1

GET /people/1 <<< That's what's used to retrieve a single record into Model

Return the first record with id of 2

DELETE /people/2

Zniszczyć pierwszy rekord o id of 7

POST /people/7?_method=DELETE

Itd.

Dlatego też modele mają swoje własne proxy, dzięki czemu mogą uruchamiać operacje RESTful za pośrednictwem tego adresu URL zmodyfikowanego w celu przestrzegania konwencji opisanych w tym linku. Możesz wyciągnąć 100 rekordów z jednego adresu URL, którego używasz jako źródła proxy sklepu, ale gdy chcesz zapisać to, co jest w pojedynczym Modelu (ponownie pomyśl tutaj "Model qua Record"), możesz wykonać te operacje specyficzne dla rekordów za pomocą innego adresu URL, którego backend MES z jednym rekordem na raz.


kiedy korzystam ze sklepów?

Aby przechowywać więcej niż jedną instancję tego modelu, można je wsadzić do sklepu. Dodajesz wiele modeli qua Zapisy do sklepów a następnie uzyskaj dostęp do tych "modeli", aby wyciągnąć dane. Więc jeśli masz siatkę, naturalnie będziesz chciał mieć wszystkie te dane lokalnie, bez konieczności ponownego odpytywania serwera o wyświetlanie każdego wiersza.

Z pierwszy post :

Modele są zazwyczaj używane ze sklepem, który jest w zasadzie zbiór instancji modelowych.

I, oczywiście, sklepy najwyraźniej pobierają informacje z modelu qua Model tutaj, aby wiedzieć, co niosą.
 1
Author: ruffin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-04 17:48:13

Znalazłem to w dokumentacji sencha App Architecture Part 2

Użyj proxy dla modeli:

Ogólnie jest to dobra praktyka, ponieważ pozwala na załadowanie i Zapisz instancje tego modelu bez potrzeby przechowywania. Również, gdy wiele sklepów używa tego samego modelu, nie musisz redefiniować swojego proxy na każdym z nich.

Użyj proxy dla sklepów:

W Ext JS 4 wiele sklepów może używać tych samych danych model, nawet jeśli sklepy będą ładować swoje dane z różnych źródeł. W naszym przykładzie, model stacji będzie używany przez Wyniki wyszukiwania i stacje store, zarówno ładowanie danych z innej lokalizacji. One returns wyniki wyszukiwania, drugi zwraca ulubione stacje użytkownika. Na aby to osiągnąć, jeden z naszych sklepów będzie musiał zastąpić serwer proxy określone na modelu.

 0
Author: Snehal Masne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-01 06:59:35