Il mio obiettivo Ho bisogno di creare un layout personalizzato (un layout di flusso) che può ricevere un numero variabile di viste e basato su di essi, crea regioni come necessario e all'interno di quelle regioni mostra le viste che vengono passate. Le viste possono essere disposte verticalmente o orizzontalmente.Creazione di un layout che accetta un numero variabile di viste (e quindi regioni)
Requisito Il layout ha un modello in cui inizialmente le regioni non sono definite. Contiene solo un wrapper (data-role="region-wrapper"
) in cui verranno renderizzate le regioni aggiunte.
Il mio approccio.
1 - estendere un Marionette.Layout
(ovviamente)
2 - Ovveride il construtor come la seguente
constructor: function(options) {
// call super here...
this.viewList= options.viewList || [];
this._defineRegions(); // see 3
}
3 - Definire regioni dinamicamente
_defineRegions: function() {
_.each(this.viewList, function(view, index) {
var name = 'flowRegion_' + index;
var definition = { selector: "[data-region='flow-region-" + index + "']" };
this.addRegion(name, definition);
}, this);
},
4 - Render regioni e viste nel metodo onRender all'interno dello stesso layout
onRender: function() {
_.each(this.viewList, function(view, index) {
// if the view has not been instantiated, instantiate it
// a region is a simple div element
var $regionEl = // creating a region element here based on the index
// append the region here
this.$el.find("[data-role='flow-wrapper']").append($regionEl);
var region = this.getRegion(index); // grab the correct region from this.regionManager
region.show(view);
}, this);
}
Questa soluzione sembra funzionare, ma mi piacerebbe sapere se sto seguendo una valida o no. Qualche altro approccio da seguire?
Grazie per la risposta. Ho bisogno di passare punti di vista che non sono uguali tra loro. Da qui il layout personalizzato. Inoltre, vorrei approfittare delle funzionalità di layout show/close. –
Non sono ancora venduto. Un elenco di widget potrebbe essere simile al caso. Ogni widget è diverso l'uno dall'altro, ma è ancora meglio essere collezione. mostra/chiudi la vista secondaria può anche essere eseguita in CollectionView in modo pulito rimuovendo il modello. Dimentica questo commento se questo non è ancora il caso. –
Ho upvoted per il vostro supporto. Grazie. Ad ogni modo, se è possibile aggiungere regioni durante il runtime, esiste un motivo. Forse mi sbaglio, ma mi piace esplorare nuove soluzioni. Perché rimuovere il modello, eliminerà la vista singola? –