2012-08-23 13 views
5

Sto lavorando all'applicazione MVC di extjs 4.Come riutilizzare l'archivio nell'applicazione EXT JS 4 MVC senza ricaricare di più?

L'applicazione esegue Viewport, che contiene un pannello. Ogni scheda ha il proprio controller e più viste.

Guarda i miei sandboxs a http://wap7.ru/folio/ext-reuseable-store/TE.html

Ho un deposito utilizzato più volte Conservare configurato con caricamento automatico (ad esempio una scheda in topmenu combobox, un altro nella griglia clienti, internet è.): Vero. Il proxy è configurato nel modello.

Il mio problema: l'archivio viene caricato più volte - ad ogni menzione nell'array del controller [memorizza].

Se rimuovo uno dalla matrice [negozi] combobox Controller- sarà vuota, anche se si afferma negozio: Ext.getStore ('STORE-ID')

Si prega di darmi un suggerimento, o un esempio di riutilizzare Store (non Model) come qui http://docs.sencha.com/ext-js/4-0/#!/guide/mvc_pt2

+0

Pubblicare il tuo codice ci aiuterà a diagnosticare questo molto più facile. –

+0

@Lev, hai la soluzione? Attualmente sono intrappolato in questo problema, la risposta di seguito è in qualche modo correlata al caricamento del negozio, ma sospetto il problema relativo all'associazione del modello e ai vari negozi. La visualizzazione dei dati anagrafici non è diretta, a meno che non sia necessario avere un archivio indipendente dal grafico degli oggetti e chiamare manualmente il filtro nel controller. – CallMeLaNN

+0

non proprio. sperando che pubblichi un commento con la correzione qualche giorno qui. –

risposta

1

È possibile creare un'istanza del negozio e caricarlo, rimuovere il caricamento automatico.

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

quindi passare tale negozio per tutti i componenti, proprio come si farebbe quando si desidera una barra di paginazione collegato ad una griglia.

+0

ho provato a farlo in Ext.application.launch() --------------- il negozio viene caricato una volta ma sia la griglia che la casella combinata sono vuoti –

0

Questo funziona normalmente bene di chiamare il negozio da altri controller:

Ext.getStore('PlatformClient'); 

Non ho mai provato a mettere lo stesso negozio in più di un controller stores array. Mi sembra strano

Ci sono un paio di altre stranezze sul codice che hai postato, forse sono solo errori di battitura e forse non fanno alcuna differenza per il framework ma sono diversi da quello che faccio normalmente così io ll li sottolineare:

in primo luogo, l'array modello della "controllore tipico" contiene un negozio:

models:[ 
'te.store.PlatformClient' 

], 

che uno è probabilmente solo un errore di battitura.

In secondo luogo, non inserisco lo spazio dei nomi completo negli array del mio negozio, questo è qualcosa che potrebbe non fare la differenza, ma non lo so. Forse ExtJS sta anteponendo lo spazio dei nomi in cima allo spazio dei nomi che hai scritto, quindi pensa che stai creando un'istanza di un negozio diverso ogni volta che inizializza un nuovo controller, causandone così il caricamento. Per esempio questo è più "normale" per tutto ciò che vale la pena:

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

Provate ad eseguire così e sbarazzarsi dei negozi di duplicazione nelle altre matrici negozio controller.

Inoltre, desidero assicurarmi di aver preso in considerazione la documentazione relativa alla non necessità di definire una configurazione storeId per gli archivi MVC.Il quadro darà automaticamente il negozio questo:

storeId: [StoreClassName] 

Quindi nel tuo esempio, si otterrebbe automaticamente:

storeId: 'PlatformClient' 

qualcun altro aveva trouble with MVC stores recently e risalire al quadro di essere sbalordito dall'audacia del dev fornendo la propria configurazione storeId con il pattern MVC.

+0

1. 'te.store .PlatformClient' era un tipo, sì! 2. –

+0

Ho messo il mio codice qui. [link] (http://wap7.ru/folio/ext-reuseable-store/TE.html) per favore guarda –

0

Abbiamo avuto problemi simili con il caricamento. Ha anche avuto problemi con il filtraggio in caso di utilizzo multiplo dello stesso negozio (potresti voler impostare un filtro su uno ma non sull'altro). Pertanto carichiamo tutti i negozi al lancio dell'applicazione. Quindi ogni volta che abbiamo bisogno di quel negozio per la visualizzazione degli scopi, invece di usare l'originale, lo stiamo clonando nella memoria con una funzione di utilità come di seguito.

/** 
* 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; 

} 

Si prega di notare che la copia clonata utilizza il proxy di memoria. Pertanto le operazioni di scrittura non dovrebbero essere eseguite su di esso. Se è necessario aggiornare il negozio, utilizzare sempre l'originale.

Spero che questo aiuti in qualche modo.