Come mantenere le informazioni relative alla vista in MVVM e posso memorizzarle nel modello?

3

Ho una discussione in corso con alcuni colleghi su come gestire le viste sul nostro modello.

Abbiamo un modello che può essere rappresentato da molte viste. Supponiamo di avere alcuni dati archiviati in un array e di visualizzare i dati in una tabella e nei grafici.
Un determinato grafico è unico ma puoi duplicare il grafico. Questo duplicato dovrebbe visualizzare i dati nello stesso modo dell'originale, ma non visualizza la stessa parte (ad esempio se i dati sono troppo grandi per visualizzarli contemporaneamente e puoi scorrere, quindi l'originale mostra i primi 10 elementi mentre quello duplicato mostra l'ultimo 10).

In qualsiasi momento puoi rimuovere una vista. La vista e il modello di visualizzazione vengono quindi cancellati dalla memoria. Il modello persiste anche se non ci sono viste che rappresentano i dati.

C'è una manciata di visualizzazione delle informazioni sulla vista che indica come e quale parte dei dati viene visualizzata. Lo scrolling è uno di quelli, quindi restiamo con quell'esempio. Questa informazione di visualizzazione non è né persistente né è memorizzata nel modello.

Se si spegne l'applicazione e si riavvia, non ci interessa sapere come è stata la vista precedente e impostiamo sempre un valore predefinito. Se, tuttavia, elimini una vista e poi annulli, vorremmo visualizzare i dati esattamente come prima dell'eliminazione. La vista appena creata non è tecnicamente la stessa di prima.
Al fine di regolare la vista, ho bisogno di mantenere la posizione di scorrimento.

Semplicemente inserisco le informazioni di visualizzazione nel modello poiché questo ha continuato a esistere per tutto il tempo. Tuttavia, alcuni colleghi non sono d'accordo e dicono che il modello dovrebbe contenere solo dati persistenti (come i dati reali che stiamo rappresentando).
Quindi non dovremmo tenere traccia delle informazioni sulla visualizzazione della vista nel modello.

Q1: è corretto dal punto di vista del design che il modello contenga solo dati persistenti? Se sì, come gestiresti le informazioni relative alla vista?

Come detto sopra, il modello può essere rappresentato da molte viste, alcune delle quali possono essere duplicate l'una dall'altra.
Diciamo che ho trovato un modo per mantenere i dati. Avrei una collezione di X che mostra informazioni.
Q2: quando si creano nuove viste che sostituiscono effettivamente le vecchie viste (parola chiave annulla), come posso determinare quali informazioni di visualizzazione della collezione dovrebbero essere associate a quale vista.
Voglio dire anche se la mia vista avesse un ID univoco, poiché ne abbiamo creato uno nuovo, non possiamo fare affidamento su questi dati.

Non riesco a capire come potrei associare correttamente queste informazioni. L'unica idea che emerge è avere un modello di vista separato per ogni vista e mantenere vivi anche i modelli di visualizzazione. D'altra parte, penso che non sia quello che dovrebbe essere, vero?

    
posta Em1 31.07.2014 - 16:21
fonte

3 risposte

1

Sono pienamente d'accordo con i tuoi colleghi sul fatto che lo stato di visualizzazione non appartiene al modello. Questo è ciò che hai ViewModels per.

Per supportare un'operazione di annullamento della chiusura di una vista, puoi mantenere ViewModel di una vista chiusa finché non è abbastanza vecchia da non poter annullare la chiusura, oppure puoi implementare Memento modello per allontanare lo stato di visualizzazione pertinente nell'elenco di annullamento.

    
risposta data 31.07.2014 - 17:24
fonte
1

Dovrei essere d'accordo con i tuoi colleghi. Non vuoi mescolare le informazioni sullo stato di visualizzazione con il tuo modello.

In questo momento hai 1 modello e potenzialmente molti ViewModels e Views che vengono distrutti quando chiusi, vero?

Sembra che ciò di cui hai bisogno sia 1 modello, 1 padre ViewModel e potenzialmente molti Child ViewModels e Views (che, di nuovo, vengono distrutti quando chiusi). La differenza fondamentale qui è che la macchina virtuale padre non viene distrutta quando le macchine virtuali figlio fanno.

Le sue responsabilità includono lo stato di visualizzazione persistente tra le istanze di View e anche l'assenza di due Visualizzazioni che mostrano la stessa porzione del Modello (credo che fosse uno dei tuoi requisiti?)

Questo aiuta a mantenere le informazioni sullo stato di visualizzazione separate dal modello e le operazioni di "annullamento" sono relativamente facili da implementare.

Qualcosa di simile

  V     V     V
  |     |     |
  VM   VM    VM
   \    |    /
    Parent VM
        |
      MODEL
    
risposta data 31.07.2014 - 16:34
fonte
0

Se la tua vista è complessa e devi memorizzare alcuni dati, forse la tua vista ha un modello, un modello che appartiene solo alla tua vista, ovviamente. IMHO questo è un modello diverso dal tuo modello di business principale, le applicazioni complesse possono avere più modelli indipendenti.

    
risposta data 31.07.2014 - 17:54
fonte

Leggi altre domande sui tag