Supongamos que tenemos datos de la siguiente maneraprogresiva con KnockoutJS
var data = {
facets: [{
name : "some name",
values: [{
value: "some value"
}]
}]
};
Podemos representar fácilmente esto como un modelo de vista unida a una plantilla de nocaut de la siguiente manera:
<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 pregunta es, ¿cómo podemos lograr el mismo resultado cuando usamos mejora progresiva? Esto es haciendo que la plantilla se represente inicialmente en el servidor y luego vincule la plantilla knockout y el modelo de vista a esa representación.
Una plantilla lado del servidor sencilla sería algo como esto:
<ul>
<li>
<span>some name</span>
<ul>
<li>some value</li>
</ul>
</li>
</ul>
he explorado algunas posibilidades diferentes:
Uno es crear una plantilla nocaut y una plantilla del lado del servidor, y genere el modelo de vista Knockout dinámicamente mediante el análisis del DOM para la plantilla del lado del servidor. De esta forma, solo la plantilla Knockout sería visible cuando JavaScript esté habilitado, y solo la plantilla del lado del servidor estaría visible si JavaScript está deshabilitado. Podrían ser diseñados de una manera para que se vean idénticos.
Otro enfoque es aplicar enlaces para cada elemento en la matriz de facetas por separado al elemento DOM existente para esa faceta. Sin embargo, este solo tiene un nivel de profundidad y no funciona para los elementos anidados.
Ninguno de estos enfoques parece bastante limpio. Otra solución podría ser escribir un enlace personalizado que maneje todo el renderizado y reutilice elementos existentes si es posible.
¿Alguna otra idea?
Yo he renunciado a la mejora progresiva con el golpe de gracia. Más allá de cualquier cosa * súper-trivial * no es práctico mantener el comportamiento no KO/KO sincronizado ... este es un problema incluso con JavaScript PE estándar, pero el rico modelo vinculante de KO lo convierte en una * extrema divergencia * en los enfoques . (¿Tal vez hay un proyecto "KO del lado del servidor"? Eso sería ... por lo menos interesante). – user2864740