Diciamo che abbiamo dati come segueprogressive enhancement con KnockoutJS
var data = {
facets: [{
name : "some name",
values: [{
value: "some value"
}]
}]
};
Possiamo facilmente rappresentare questo come un modello di vista legato ad un modello di eliminazione diretta come segue:
<ul data-bind="foreach: facets">
<li>
<span data-bind="text: name"></span>
<ul data-bind="foreach: values">
<li data-bind="text: value"></li>
</ul>
</li>
</ul>
La domanda è: come possiamo ottenere lo stesso risultato usando il miglioramento progressivo? Ovvero avendo inizialmente il rendering del template sul lato server e quindi vincendo il modello ad eliminazione diretta e il modello di visualizzazione a quel rendering.
Un modello lato server semplice sarebbe simile a questa:
<ul>
<li>
<span>some name</span>
<ul>
<li>some value</li>
</ul>
</li>
</ul>
ho esplorato alcune possibilità differenti:
Uno è creare un modello knockout e un modello lato server, e generare dinamicamente il modello di visualizzazione Knockout analizzando il DOM per il modello lato server. In questo modo, solo il modello Knockout sarà visibile quando JavaScript è abilitato e solo il modello lato server sarà visibile se JavaScript è disabilitato. Potrebbero essere abbinati in modo da renderli identici.
Un altro approccio consiste nell'applicare i collegamenti per ciascun elemento nell'array di facet separatamente all'elemento DOM esistente per tale facet. Tuttavia, questo è ancora solo un livello profondo e non funziona per gli elementi nidificati.
Nessuno di questi approcci sembra piuttosto pulito. Un'altra soluzione potrebbe essere quella di scrivere un'associazione personalizzata che gestisca l'intero rendering e riutilizza gli elementi esistenti, se possibile.
Altre idee?
ho rinunciato a progressive enhancement con Knockout. Al di là di qualsiasi cosa * super-banale * non è proprio pratico mantenere sincronizzato il comportamento non KO/KO. Questo è un problema con il PE JavaScript standard, ma il ricco modello di binding di KO lo rende * una divergenza estrema * negli approcci . (Forse c'è un progetto "Server-side KO"? Sarebbe .. interessante per non dire altro.) – user2864740