Organizzazione di grandi applicazioni Javascript - Il livello di visualizzazione

1

Oggi le applicazioni Javascript di una dimensione pertinente diventano sempre più comuni e, in caso di necessità, vengono identificati alcuni modelli per gestire il complessità del codice.

Cerco di seguire un buon consiglio, ma ho qualche problema nell'organizzare il livello di visualizzazione di un'applicazione che sto scrivendo. Mentre gli altri livelli sono ben disaccoppiati, ho un grosso blob per l'interfaccia utente che vorrei evitare. Per chiarire le cose, non sto parlando dell'applicazione che la dimensione Osmani (vedi il link sopra) considera - come Gmail - ma comunque abbastanza grande da meritare un'architettura leggermente migliore.

Il mio problema è che ho molti elementi dell'interfaccia utente che devo inserire. Tutti questi elementi possono avere margini, paddings e così via, e ho bisogno di impostare in modo esplicito le loro dimensioni, in quanto l'interfaccia utente ha un sacco di vincoli che non sono espressi dai CSS (ad esempio, alcune immagini devono essere ridimensionate con un numero intero di loro appare in fila, senza spazio vuoto alla fine). Come se questo non fosse abbastanza, la dimensione di alcuni elementi dipende da quanto spazio il loro contenitore consente, e questo può dipendere dalla dimensione di altri elementi e così via.

Quello che sto facendo adesso è calcolare la dimensione di tutti gli elementi ogni volta che la dimensione della finestra cambia. Parto dal primo, che posso calcolare liberamente. Non appena viene posizionato, sparo un evento che attiva il calcolo della seconda e così via.

Questo approccio funziona più o meno, ma è brutto da morire. Ogni funzione è piena di codice come

function resizeFoo() {
    var parent = $('#foo').parent(),
        parentWidth = parent.width(),
        availableWidth = parentWidth - parseInt(parent.css('padding-left'), 10);

    $('#foo').width(availableWidth);
}

solo molto più a lungo. Non appena aggiungo il padding destro al genitore di # foo, devo aggiornarlo. Ovviamente, potrei sottrarre il padding da entrambi i lati fin dall'inizio, rendendolo più lungo.

Are there any useful patterns to handle complex UI sizing and positioning requirements, so that I can reorganize all of the above mess into something meaningful?

    
posta Andrea 04.12.2011 - 13:41
fonte

1 risposta

2

Sto postando questo come risposta invece di un commento, perché è piuttosto grande per un commento, anche se non è una risposta vera.

Come ho detto nel mio commento, framework di componenti come ExtJS e Dojo risolvono questo problema. Possono servire come ispirazione. Conosco personalmente ExtJS, quindi fornirò alcuni suggerimenti su dove trovare ciò che ti serve per ExtJS.

Essenzialmente tutto nell'interfaccia utente di un'app ExtJS è una sottoclasse di Ext.Component (= riquadro sullo schermo) e Ext.Container (sottoclasse componente che può contenere componenti). Ext.Container espone i componenti figlio utilizzando un layout (sottoclasse di Ext.layout.Layout). I layout utilizzano una combinazione di CSS, javascript basato sugli eventi e markup strutturale (ad esempio tag di tabella) per raggiungere il loro obiettivo. Usi sempre il sistema di layout, il posizionamento diretto con CSS non è "il modo ExtJS".

Per scoprire come implementano questo:

  1. Spiegazione sul modello del componente e sul ciclo di vita: link
  2. Una spiegazione sul sistema di layout: link
  3. I documenti dell'API ExtJS: link

Nei documenti API puoi fare clic sul titolo della pagina API di un componente per visualizzarne il codice sorgente.

Se leggerai la tua strada attraverso tutto ciò, scoprirai come ExtJS risolve questo problema. Non è un meccanismo semplice, ma è un sistema molto scalabile.

    
risposta data 05.12.2011 - 10:59
fonte

Leggi altre domande sui tag