javascript - item - knockoutjs com observablearray
Knockout no intrusivo (5)
¿Debería simplemente aceptarlo por lo que es y no preocuparme en la práctica?
Mi entendimiento es que "discreto" significa algunas cosas diferentes.
Un aspecto de "discreto" es que los sitios web deben mantener la funcionalidad principal en los navegadores con soporte de JavaScript limitado o ninguno en absoluto. Con ese fin, su preocupación por este principio debería depender de su público objetivo. Trabajé en proyectos en los que conocía a mi público objetivo lo suficiente como para darme el lujo de decir: "si desea aprovechar esta aplicación web, use un navegador moderno como Chrome, con JavaScript habilitado". En este caso, siéntete libre de ponerte salvaje con los últimos y más asombrosos frameworks de front-end.
Trabajé en otros proyectos donde este no era el caso, tuvimos que ser muy cuidadosos con nuestro uso de frameworks como Knockout. Si confía plenamente en Knockout para realizar funciones básicas en su aplicación, entonces su aplicación es inherentemente intrusiva. Que esto te moleste o no depende de tu público objetivo.
Otro principio de "JS discreta" es una separación de preocupaciones entre JavaScript y HTML. De hecho, debato cuán estrictamente importante es este principio. Creo que un principio más importante es la separación de las preocupaciones entre la lógica del modelo de visualización y la lógica de visualización , siguiendo el patrón de MVVM. Knockout hace un trabajo fantástico al fomentar la separación limpia de las cuestiones de vista / vm, incluso si pones un poco de lógica de JavaScript en tus enlaces de datos. Siempre y cuando sea estrictamente lógica de vista , creo que realmente pertenece a la vista.
Recientemente me puse al día con Knockout y creo que es un marco fantástico. Sin embargo, tengo una preocupación.
Estoy descubriendo que en casos de enlace no triviales, tengo fragmentos de código javascript que se arrastran en mi vista (marcado). De hecho, bastantes ejemplos de código en la documentación Knockout lo demuestran también.
¿Esto hace que Knockout intrusivamente intrusivo?
¿Debería simplemente aceptarlo por lo que es y no preocuparme en la práctica?
¿O hay algún patrón / técnica que debería emplear para hacer que Knockout sea discreto?
Gran pregunta He estado escribiendo vistas complejas de KnockoutJS por un tiempo y nunca me satisfizo hasta que cambié al proveedor de enlaces de clase de Ryan Niemeyer .
El Knockout ClassBindingProvider le permite declarar sus enlaces en un objeto JavaScript y luego hacer referencia a ellos desde un atributo de data-class
similar a cómo funcionan las clases CSS. ¡Funciona genial!
Vea un ejemplo de la aplicación TodoMVC .
Intenta mantener Javascript fuera de los enlaces y solo utilízalo para metadatos
entonces en lugar de hacer
<span data-bind="visible: errors().length > 0">You have errors</span>
Use un observable computable
<span data-bind="visible: hasErrors">You have errors</span>
Actualización: continué y creé una Convención sobre la API de configuración para KO. Puede encontrarse aquí https://github.com/AndersMalmgren/Knockout.BindingConventions/wiki
En lugar de hacer <button data-bind="click: save">Save</button>
estás haciendo <button data-name="save">Save</button>
. La biblioteca entenderá por convención que desea conectar la función de guardar al controlador de clic de botón. Por convención, también vinculará habilitar si un miembro canSave está presente. http://jsfiddle.net/3Ajnj/15/
Te recomiendo que hagas una visita al blog de Ryan y leas: "Simplificando y limpiando vistas en KnockoutJS", si no lo has hecho ...
http://www.knockmeout.net/2011/08/simplifying-and-cleaning-up-views-in.html
Explica algunas buenas maneras para que refactorices tu código, para que no ocupe demasiado el html y lo mantenga más limpio.
Una alternativa para el proveedor de enlace sugerido en la respuesta seleccionada es knockout.unobtrusiveBindingProvider , que es "un proveedor de enlace discreto, basado en convenciones para Knockout JS que permite una separación clara de los enlaces de datos HTML y Knockout".