2012-04-16 16 views
6

Jestem naprawdę nowy na wzór MVC w Ext. Mam tabpanel z wieloma wystąpieniami tego samego komponentu (nazwijmy to produktem), każdy powinien wywołać serwer, gdy jest otwarty, z parametrem id.ExtJS4 - Przechowywać na instancji panelu?

Teraz, w celu stworzenia tych kart - używam tego w kontrolerze Produktu który tworzy nową instancję widoku, ale czuję, że to naprawdę nieprawidłowe.

createMainView: function (opts) { 
    return Ext.widget("productDisplay", opts); 
} 

nazywam go z moim „głównym” kontrolera, tak:

var tab = this.application.getController("Products") 
    .createMainView({ productId : id, closable: true }) 

tabs.add(tab); 
tabs.setActiveTab(tab); 

Co znajduje się w poprawny sposób prawidłowo korzystać z wielu wystąpień widzenia, każda o wystąpienie jednego sklepu i zachowania (przez kontroler).

Czy mogę dla nich użyć jednego nazwanego sklepu (z plikiem js w aplikacji/store/product.js)?

Czy mogę ręcznie wywołać load w sklepie ze sterownika (aby przekazać productId), czy jest tam ładniejszy sposób?

Odpowiedz

6

To bardzo szerokie i interesujące pytanie, które wymaga dużych i dokładnych wyjaśnień (które można znaleźć na stronie Sencha.com w ich przewodnikach i podręcznikach). Chciałbym podkreślić kilka punktów, więc masz coś na początek:

  1. Sklepy są zwykle obiektami globalnymi. Nie przechowujesz dwóch wystąpień jednego sklepu w ogóle. Możesz użyć filtrowania (lokalnego lub zdalnego), jeśli chcesz wyświetlać informacje z tego sklepu w kilku różnych widokach. Jedynym czasem, w którym chcesz sklonować sklep, jest prezentacja różnych informacji z tego sklepu w dwóch różnych widokach: w tym samym czasie:.

  2. Kontrolery są zwykle tworzone przez główny obiekt aplikacji. Nie musisz robić nic specjalnego - po prostu wpisz je w usłudze controllers: []. A następnie spawnie po uruchomieniu aplikacji (zanim ich widoki zostaną utworzone i renderowane). Miej to w pamięci.

  3. Jeśli masz widok modalny - można go utworzyć ręcznie i albo użyć go ponownie, albo zniszczyć i odtworzyć później. Możesz dodać filtrowanie i ładowanie do kontrolera, który tworzy te widoki. W razie potrzeby można ponownie użyć tych samych obiektów widoku/kontrolera dla różnych kart.

  4. Jeśli w widokach prezentowane jest jedno wystąpienie obiektu (np. Jeden produkt jest wyświetlany na każdej karcie) - nie dołączaj do nich magazynów. Po prostu podaj im indywidualny model (rekord).

+0

dziękuję za odpowiedzi. Widziałem już wcześniej przykłady filtrowania magazynu, ale to było wtedy, gdy jest jeden widok, który jest zasilany filtrowanymi danymi, w moim przypadku istnieje wiele kart, które istnieją w tym samym czasie, z których każdy wyświetla różne dane (tego samego typu, dlatego Pytałem o duplikowanie sklepu), nie są one modalne (jeśli masz na myśli modal jak prompt), istnieją one w tym samym czasie. – Madd0g

+0

Czy potrzebujesz sklepu (w zasadzie w zasadzie) w każdym widoku lub tylko modelu (rekord)? – sha

+0

Nie wiedziałem, że ten rekord może być używany poza sklepem - tak myślę, że dlatego model może mieć proxy. Czy pojedynczy rekord może mieć funkcję ładowania/zapisywania/wiązania? – Madd0g

0

Polecam tworzenie sklepów, które odnoszą się tylko do tego widoku widoku wewnątrz metody initComponent widoku.

Kontrolery twojego kontrolera control powinny być zakodowane w taki sposób, aby mogły odróżnić, który widok wywołał zdarzenie. Nie powinno to być zbyt trudne, ponieważ prawie wszystkie zdarzenia widoku zawierają odniesienie do komponentu, który wywołał zdarzenie. Następnie możesz użyć względnych selektorów zapytań, np .: myEventFiringComponent.up('anotherComponent') lub myEventFiringComponent.down('anotherComponent'), aby uzyskać uchwyt dla innego komponentu w tym samym widoku, jeśli potrzebujesz.

Aby uzyskać pełne wyjaśnienie, patrz this post.

+0

Dzięki Geronimo, właśnie to zrobiłem. Tworzę magazyn pod 'initComponent' i upewniając się, że wszystko pod' this.control' może odwoływać się do konkretnego widoku (a co nie - staram się zawinąć w moje własne 'fireEvent'). – Madd0g

Powiązane problemy