2012-08-23 16 views
5

Pracuję nad aplikacją extjs 4 MVC.Jak ponownie wykorzystać sklep w aplikacji EXT JS 4 MVC bez wielokrotnego ponownego ładowania?

Aplikacja uruchamia rzutnię, która zawiera tabpanel. Każda karta ma własny kontroler i wiele widoków.

Zobacz moje sandboxs na http://wap7.ru/folio/ext-reuseable-store/TE.html

mam jeden sklep używane kilka razy Store skonfigurowany z autoload (np jedna karta w topmenu combobox, kolejny w siatce clietns.): True. Serwer proxy jest skonfigurowany w modelu.

Mój problem: Sklep jest ładowany wiele razy - przy każdej wzmiance w tablicy kontrolerów [sklepów].

Jeśli usunąć jedną z tablicy [sklepy] Controller combobox będzie pusta, chociaż stwierdza Store: Ext.getStore („store-ID”)

Proszę dać mi wskazówkę, czy przykładowe ponowne używanie Store (nie Model), jak tutaj, http://docs.sencha.com/ext-js/4-0/#!/guide/mvc_pt2

+0

Opublikowanie kodu pomoże nam zdiagnozować to znacznie łatwiej. –

+0

@Lev, czy masz rozwiązanie? Obecnie jestem uwięziony w tym wydaniu, a odpowiedź poniżej w jakiś sposób wiąże się z ładowaniem sklepu, ale podejrzewam, że ten problem dotyczy powiązania modelu i wielu sklepów. Wyświetlanie danych podstawowych nie jest proste, chyba że muszę mieć niezależny od grafu obiektu i filtra wywołania ręcznie w kontrolerze. – CallMeLaNN

+0

niezupełnie. mając nadzieję, że opublikujesz komentarz z poprawką pewnego dnia tutaj. –

Odpowiedz

1

Możesz po prostu utworzyć swój sklep i załadować go, usunąć automatyczne ładowanie.

var store = Ext.create('App.store.YourStore').load(); 

Następnie przekaż ten sklep do wszystkich komponentów, tak jak zrobiłbyś, gdy chcesz, aby pasek przywoławczy był podłączony do siatki.

+0

Próbowałem to zrobić w Ext.application.launch() --------------- sklep jest ładowany raz, ale zarówno siatka jak i combobox są puste –

0

to normalnie działa dobrze nazwać swój sklep z innych kontrolerów:

Ext.getStore('PlatformClient'); 

Nigdy nie próbowałem umieścić ten sam sklep w więcej niż jednym kontrolerze stores tablicy. Wydaje mi się to dziwne.

Jest kilka innych dziwactw na temat kodu, który napisałeś, może to tylko literówki i może one nie mają znaczenia dla ram, ale różnią się od tego, co robię normalnie. ll wskazać je:

po pierwsze, tablica model „typowego kontrolera” zawiera sklep:

models:[ 
'te.store.PlatformClient' 

], 

że jeden jest prawdopodobnie tylko literówka.

Po drugie, nie umieszczam pełnego obszaru nazw w moich tablicach sklepów, to jest coś, co nie ma znaczenia, ale nie wiem. Być może ExtJS przygotowuje przestrzeń nazw w górnej części przestrzeni nazw, którą wypisałeś, więc uważa, że ​​tworzysz inny magazyn za każdym razem, gdy inicjuje nowy kontroler - co powoduje ponowne ładowanie. Na przykład jest to bardziej „normalne” dla co warto:

stores:[ 
    'Taxonomy', 
    'PlatformClient', 
    'DataType' 
], 
controllers:[ 
    'Taxonomies' , 
    'DataType' , 
    'DataSale' , 
    'Clients' 
], 

Spróbuj ustawić go tak i pozbyć się dublowania sklepach w innych tablicach sklepowych kontroler.

Ponadto chcę się upewnić, że przechwycono nieco w dokumentach o tym, że nie trzeba definiować konfiguracji storeId dla sklepów MVC.Ramy automatycznie dać sklepu to:

storeId: [StoreClassName] 

Tak więc w swoim przykładzie, co można uzyskać to automatycznie:

storeId: 'PlatformClient' 

Ktoś inny miał trouble with MVC stores recently i sięgają do ram jest zaskoczony przez Audacity dewelopera dostarczającego własną konfigurację storeId ze wzorcem MVC.

+0

1. 'te.store .PlatformClient' był typem, tak! 2. –

+0

Tutaj umieszczam mój kod. [link] (http://wap7.ru/folio/ext-reuseable-store/TE.html) proszę spojrzeć –

0

Mieliśmy podobne problemy z ładowaniem. Występują również problemy z filtrowaniem w przypadku wielokrotnego użycia tego samego sklepu (możesz ustawić filtr na jednym, ale nie na drugim). Dlatego ładujemy wszystkie sklepy podczas uruchamiania aplikacji. Wtedy, gdy potrzebujemy tego sklepu do wyświetlania celów, zamiast używać oryginału, klonujemy go w pamięci za pomocą funkcji użytecznej, jak poniżej.

/** 
* Use this for example if you want to apply a filter on a store 
* but you dont want the original store to change, so: 
* singleton store has no filter 
* you clone it to be used with filters in some places. 
* 
* Note: this will have memory proxy, so no changes to the stores are persistent, 
* changes will have no effect on the local/remote db. 
* 
*/ 
createStore: function(storeId, data) { 

    // 
    // Creates a new store from the given array of records without 
    // registering the new store. 
    // See cloneStore for more info 
    // 
    var modelName = storeId; 
    var prevStore = Ext.getStore(storeId); 
    data = data || prevStore.data.all; 

    var clonedStore = Ext.create('App.store.' + storeId, { 
     data: data, 
     model: 'App.model.' + modelName, 
     proxy: 'memory' 
    }); 

    Ext.data.StoreManager.register(prevStore); 

    return clonedStore; 

} 

Należy pamiętać, że sklonowana kopia korzysta z proxy pamięci. Dlatego nie należy wykonywać na nim operacji zapisu. Jeśli chcesz zaktualizować sklep, zawsze używaj oryginału.

Mam nadzieję, że to pomoże w pewien sposób.

Powiązane problemy