2012-04-16 8 views
6

Sono davvero nuovo per il pattern MVC in Ext. Ho un tabpanel con più istanze dello stesso componente (chiamiamolo prodotto), ognuno dovrebbe chiamare il server quando è aperto, con un parametro id.ExtJS4 - Memorizza per istanza del pannello?

In questo momento, al fine di creare queste schede - Io uso questo nel controller del prodotto che crea una nuova istanza di una vista, ma mi sento come se fosse davvero errato.

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

mi chiamano dal mio controllo "principale", in questo modo:

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

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

Qual è il modo corretto di utilizzare correttamente più istanze di una vista, ciascuno con un'istanza di un negozio e di comportamento (tramite il controller).

Posso utilizzare un negozio denominato per loro (con un file js in app/store/product.js)?

Devo chiamare manualmente lo load sullo store dal controller (per passare lo productId) o c'è un modo migliore?

risposta

6

È una domanda molto ampia e interessante che richiede una spiegazione ampia e approfondita (che è possibile trovare su Sencha.com nelle guide e nei manuali). Vorrei evidenziare i punti di coppia in modo da avere qualcosa per iniziare:

  1. I negozi sono in genere oggetti globali. Non mantieni due istanze di un negozio in generale. È possibile utilizzare il filtro (locale o remoto) se è necessario presentare le informazioni da tale archivio in diverse visualizzazioni. L'unica volta che è necessario clonare il negozio è se si desidera presentare informazioni diverse da quel negozio in più di 2 viste differenti allo stesso tempo.

  2. I controllori vengono in genere generati dall'oggetto dell'applicazione principale. Non devi fare nulla di speciale - basta elencarli nella proprietà controllers: []. E poi spawed quando viene lanciata l'applicazione (prima che le loro viste vengano create e renderizzate). Tienilo a mente.

  3. Se si dispone della vista modale, è possibile crearla manualmente e riutilizzarla o distruggerla e ricrearla successivamente. È possibile aggiungere il filtro e il caricamento al controllore che crea queste viste. Ed è possibile riutilizzare gli stessi oggetti vista/controllore per schede diverse, se lo si desidera.

  4. Se le viste presentano un'istanza di un oggetto (ad esempio, un prodotto viene visualizzato su ciascuna scheda), non allegare negozi a tali viste. Basta passare loro modello individuale (record).

+0

grazie per le vostre risposte. Ho già visto alcuni esempi di filtraggio dei negozi, ma quello era il momento in cui c'è una vista che viene alimentata con i dati filtrati, nel mio caso ci sono più schede che esistono contemporaneamente, ognuna con dati diversi (dello stesso tipo, ecco perché Ho chiesto di duplicare il negozio), non sono modali (se intendi come modale come prompt), esistono allo stesso tempo. – Madd0g

+0

Quindi hai bisogno di un negozio (array in pratica) in ogni vista o solo modello (record)? – sha

+0

Non sapevo che il record potesse essere usato al di fuori di un negozio - immagino sia per questo che un modello possa avere un proxy. Un singolo record può avere funzionalità di caricamento/salvataggio/associazione? – Madd0g

0

Si consiglia di creare gli archivi che riguardano solo l'istanza di visualizzazione all'interno del metodo initComponent della vista.

I gestori del controller control devono essere codificati in modo da poter differenziare la vista che ha inviato l'evento. Questo non dovrebbe essere troppo difficile perché quasi tutti gli eventi di visualizzazione contengono un riferimento al componente che ha attivato l'evento. È quindi possibile utilizzare i relativi selettori di query, ad esempio myEventFiringComponent.up('anotherComponent') o myEventFiringComponent.down('anotherComponent') per ottenere un handle su un altro componente nella stessa vista, se necessario.

Vedere this post per una spiegazione completa.

+0

Grazie Geronimo, è esattamente quello che ho finito per fare. Sto creando lo store sotto 'initComponent' e assicurandomi che tutto sotto' this.control' possa fare riferimento alla vista specifica (e cosa no - cerco di racchiudere il mio 'fireEvent'). – Madd0g

Problemi correlati