2011-10-29 12 views
18

He estado mirando el patrón MVVM, específicamente knockoutjs, y sobre todo me hace encogerme. No voy a entrar en una larga diatriba sobre los beneficios de mantener la estructura, presentación y mostrar por separado, sólo voy a preguntar (como ejemplo): ¿Cuál es la diferencia entre¿Qué es MVVM, y deberíamos usarlo?

<button data-bind="click: someJavaScriptFunction">Something</button> 

y

<button onclick="someJavaScriptFunction();">Something</button> 

y deberíamos poner tanto control de comportamiento en el marcado? Tan limpio y tan minimalista como esto es, parece ir en contra de todos los principios de programación web que he escuchado.

¿Estoy equivocado?

+2

Siempre he creído que debería intentar no tener más de un idioma en un solo archivo. normalmente establezco una identificación o clase y le enlace la función una vez que la página ha terminado de construirse. – dqhendricks

+6

Parece que el problema aquí es menos acerca de MVVM y más acerca de los pros/contras de JavaScript discreto: http://en.wikipedia.org/wiki/Unobtrusive_JavaScript – Craig

+0

@ Craig Tener ese enlace de datos en el marcado no aparece en el espíritu de js discreto, así que no estoy seguro de que de eso se trata. – heisenberg

Respuesta

7

Su único uso de una parte de MVVM, específicamente la Vista, en ese ejemplo de código que proporcionó anteriormente. La razón para utilizar Knockout (o cualquier otra biblioteca de MVVM) es facilitar el enlace de sus vistas a un Modelo, un Modelo de Vista, lo que le permite dejar de escribir muchos códigos repetitivos solo para devolver valores de su vista.

veo un montón de javascript poco firme código/jQuery donde la gente va y usar algo como esto:

var ex = { 
    some1: $('#textbox1').val(), 
    some2: $('#textbox2').val() 
}; 

El problema con esto es que está literalmente llena en toda la aplicación web y se convierte en extremadamente tedioso mantener. Sé que con Knockout, siempre que se actualice mi View, mi View Model también se actualizará.

No es necesario para todas las aplicaciones, y no debe usarlo solo porque es "bueno" de usar. Obviamente debe haber una razón para usarlo, mi ejemplo anterior es una de las razones y estoy seguro de que hay más.

+0

De lo que estás hablando es enlace de datos. Y eso es lo que originalmente me permitió noquear, pero esa no es la única forma de enlazar datos. Hay un plugin de jQuery (http://ajaxian.com/archives/jquery-data-binding-templates-and-mobile-john-resig-at-fowa), por ejemplo, que permite el enlace de datos muy fácil sin incrustar esa lógica vinculante en el html. – nicholas

+0

La vinculación de datos, como la manipulación del dom, las plantillas o la inyección de dependencias, son, me parece a mí, técnicas o herramientas que no forman parte de ningún patrón específico. – nicholas

+2

@nicholas Ya sea que esté colocando los id. Html en javascript con esa biblioteca, o los nombres de los campos javascript en el html con nocaut, el tipo de lo mismo no es el mismo? El poder con MVVM no es tanto el enlace de datos, sino el enlace de comportamiento, cuando se llega a tener propiedades de estado de vista y no solo propiedades de datos, permite una forma mucho más fácil de desarrollar pantallas interactivas. Pero como se indicó anteriormente, no es para cada caso de uso, solo otra herramienta en la caja de herramientas. –

13

Aquí hay una respuesta más directa a su pregunta.

En el segundo ejemplo, se está refiriendo a una función que tiene que ser en el ámbito global (es decir, una propiedad del objeto window).

En el primer ejemplo, se refiere a una propiedad del modelo de vista actual.

Sí, es una distinción sutil, pero es importante. Si usa atributos en el evento, solo puede referirse a cosas que existen en el alcance global. Esto significa que tiene que poner todo lo que desea acceder en el ámbito global, lo que conduce a un código muy desordenado.

Si usa enlaces declarativos, el significado exacto de los enlaces depende del contexto.

Ayuda a pensar en el marcado HTML como una coincidencia. Lo que realmente está mirando es el acceso estructurado al modelo de vista. Piense en with y forEach como contextos anidados y de los otros enlaces como sus atributos. La relación entre los enlaces declarativos y el HTML subyacente de repente parece más como trabajar con XSLT.

Los dos ejemplos parecen muy similares. Pero los conceptos subyacentes son muy diferentes y hacen que los datos sean tan potentes y los atributos en el evento sean tan desagradables.

La razón por la que los atributos de evento están mal visto no es solo que combinan la lógica con la estructura. Es que son un intento débil de atornillar código JavaScript arbitrario a elementos HTML que impide la encapsulación adecuada de la lógica de la aplicación.Los atributos en el evento son "ganchos" de bajo nivel, los enlaces amplían el comportamiento de los elementos.

Dicho todo esto, es posible hacer las mismas cosas horribles que las personas han hecho con los atributos en el evento mediante el uso de enlaces declarativos. La diferencia está en qué más puedes hacer con ellos. No siempre debes juzgar las tecnologías por cómo se puede abusar de ellas: todos somos adultos aquí.

+1

FWIW, es probable que no encuentre enlaces terriblemente útiles fuera de las aplicaciones de una sola página (léase: aplicaciones web que dependen en gran medida de JavaScript). Podrían ser útiles para enlazar widgets simples como datapickers, pero es difícil encontrar un caso de uso para sitios web normales que no podrían replicarse fácilmente con los selectores de CSS y jQuery. –

+0

Gracias Alan. Esa distinción tiene mucho sentido. +1 – nicholas

+0

Pero el alcance del javascript llamado no tiene más que ver con la forma en que se organiza el script que si debe existir o no en el marcado. Podría hacer algo así como (para usar una sintaxis común de jQuery) onclick = "$ (this) .data ('myplugin'). SomeFunction()" para llamar a una función con el uso del controlador onclick. – nicholas

Cuestiones relacionadas