2012-06-02 14 views
11

Attualmente sto lavorando su una soluzione ASP.NET MVC e di recente ho introdotto sia Knockout (una libreria JV MVVM) che Wijmo (una serie di widget dell'interfaccia utente jQuery).Come posso generare modelli di visualizzazione lato client per knockout in un progetto ASP.NET MVC?

Con l'introduzione di Knockout, devo anche avere modelli sul lato client, quindi per questo scopo sto serializzando C# ViewModel e collegandolo alla vista usando data-model="@Model.ToJson()". Questo mi consente di recuperare il modello da JS e applicare un po 'di amore sul lato client a tutto.

Tuttavia, l'eliminazione diretta richiede che tutto sia osservabile, quindi devo dichiarare un ViewModel lato client separato e mappare tutto dall'oggetto modello dati. Mi sembra molto simile a uno sforzo doppio e vorrei evitarlo in qualche modo.

Spero che qualcuno abbia uno strumento o una tecnica da condividere che mi permetta di rendere il ViewModel a eliminazione diretta direttamente dal server. La soluzione possibile potrebbe includere:

  • Serializzazione JSON personalizzata per rendere il modello di vista osservabile direttamente sull'output dell'attributo modello dati.
  • automatica trasformazione client-side (ho sentito di ko-bind automatico, ma non so se sarebbe un percorso consigliato di prendere o come stabile/completare lo è)
  • qualcosa che non ho pensato di

Mi piacerebbe che la soluzione fosse generica e automatica, poiché il mio attuale approccio di digitare manualmente i modelli osservabili sul lato client è troppo improduttivo per essere fattibile.

Come state risolvendo questo problema?

risposta

10

Secondo i loro tutorial è solo una semplice .map funzione

Se questo è il ViewModel

function Task(data) { 
    this.title = ko.observable(data.title); 
    this.isDone = ko.observable(data.isDone); 
} 

E questa funzione get Sono i dati dal server, si utilizza la funzione .map per iniettare i dati del server a destra nella VM

// Data 
var self = this; 
self.tasks = ko.observableArray([]); 

// Load initial state from server, convert it to Task instances, then populate self.tasks 
$.getJSON("/tasks", function(allData) { 
    var mappedTasks = $.map(allData, function(item) { 
     return new Task(item) 
    }); 
    self.tasks(mappedTasks); 
}); 

Per ko mappatura http://knockoutjs.com/documentation/plugins-mapping.html

per Auto-bind Ecco un esempio

https://groups.google.com/forum/#!msg/knockoutjs/IJTx37UXQVw/UTrWdEK1C-oJ

+0

Questo è esattamente quello che sto già facendo, come hai bisogno di una funzione di task per ogni guarda il modello. La soluzione che sto cercando non dovrebbe richiedere di avere un metodo o una classe per ogni modello di visualizzazione, ma piuttosto un singolo pezzo di codice condiviso per eseguire la trasformazione (lato client o lato server). Correggimi se mi sbaglio –

+0

Ecco dove vuoi che l'autobind sia stato chiamato, o sì, altrimenti devi averne uno per :-( –

+0

L'autobind funziona? È stato aggiornato l'ultima volta 7 mesi fa e il readme dice "Questo è intial commit e supporta solo legare i nomi degli elementi a viewmodel ", e questo sembra implicare che manchi qualcosa o che alcuni casi non funzionino, senza essere molto espliciti a riguardo.Inoltre, il jsfiddle a cui l'autore si collegava in un altro post era rotto, quindi potresti usare un esempio se questo è il tuo consiglio;) –

Problemi correlati