2013-12-13 14 views
6

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?

risposta

6

Forse non sono stato completamente seguito, ma non riesco a vedere alcun motivo per cui un collectionView non può essere utilizzato in questo caso.

Le viste secondarie sono tutte nello stesso schema, con data-region='flow-region-" e persino con index. Questo è un modello ovvio di raccolta e la sua visione.

Con CollectionView si possono fare cose simili, aggiunta/rimozione di vista del bambino, completamente di reset, vicino ecc

Se questo è il caso consiglio vivamente di utilizzare CollectionView o CompositeView, invece di Regione prioritario qui.

Aggiornamento

  1. Sul perché la rimozione di un modello causerà la rimozione di vista.

    Perché Marionette CollectionView ha tale ascoltatore in constructor:

    this.listenTo(this.collection, "remove", this.removeItemView, this); 
    
  2. Aggiungi regione in fase di esecuzione.

    È del tutto legittimo, anche se non l'ho mai fatto prima. Layout ha il metodo prototipo addRegion(name, definition), quindi qualsiasi istanza di layout dovrebbe essere in grado di aggiungere/rimuovere aree/regioni in runtime. L'utilizzo sarebbe come questo:

    foo_layout.addRegion({region1: '#region-1'}); 
    
+0

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. –

+0

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. –

+0

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? –

Problemi correlati