2009-08-31 22 views
11

¿Qué patrones de interfaz de usuario usas habitualmente en JavaScript?Patrones de interfaz de usuario en JavaScript

Por patrones de interfaz de usuario Me refiero a las mejores prácticas para construir y organizar UI, generadas/administradas desde JavaScript (además de bibliotecas como jQuery o YUI).

Por ejemplo, si proviene de .NET World, está familiarizado con la familia de patrones MVC (Modelo-Vista-Controlador). En el mundo de WinForms y ASP.NET, se encontrará con Model-View-Presenter. En WPF es muy probable que encuentre el enfoque MVVM (Model-View-ViewModel).

¿Y qué pasa con JavaScript?

+0

no hay ninguna razón por la cual MV [C | P] no debería aplicarse, es un lenguaje bonito e independiente. – Chii

Respuesta

7

Los patrones suelen ser independientes del idioma. Si un patrón tiene valor, salvo ciertos casos extremos, tendrá valor independientemente del idioma o la tecnología que esté utilizando. Toma MVC. El concepto de separar el modelo de la vista del controlador tiene valor independientemente de si el modelo está implementado con un RDBMS o alguna otra tecnología, ya sea que la vista sea HTML o Swing o X.

Donde ve ciertos patrones aplicados más en una tecnología más que en otra, generalmente solo significa que los desarrolladores de la tecnología tenían un enfoque particular que respaldaban más que otros.

JavaScript no le impone ningún patrón en particular. Algunos marcos de JavaScript, como YUI o Dojo o Glow, tenderán a guiarlo en una dirección más que en otra.

Al final del día, observe el problema que está resolviendo, los recursos y la experiencia que tiene, y siga los patrones que tengan sentido.

+0

¡Gracias por la respuesta, T.J! No lo marqué como respuesta antes, porque estaba en duda. Pensé que debería haber algo más popular que el resto. Pero parece que en JavaScript World usted usa bibliotecas o adopta algo de otras plataformas (MVx), que se adapta mejor a su problema. – Anvaka

1

Como sé, todavía no hay patrones específicos para Javascript. Pero creo que hay un potencial para algo como el enfoque de widgets (componentes). Dado que principalmente utilizamos javascript para potenciar nuestro código html. Es lógico que debemos conectar todos nuestros objetos javascript a la etiqueta html. Entonces aquí tenemos algo como Model (jsObject) + View (HTMLrepresentation). Para obtener MVC necesitamos controladores y tenemos eventos para esto. En este caso, habremos encapsulado fácilmente el componente extensibel.

por ejemplo:

// this is a part of some FormValid.js 
<script> 
function FormValid(){ 

} 

FormValid.prototype.validate=function(){...} 
</script> 

//this is our HTML 
<form id="form1"...onsubmit="this.jsObject.validate();"> 
</form> 

<script> 
//all the following stuff could be solved in one line, but you need to create some helper. Like Components.Attach("FormValid").to("form1"); 
var newObj=new FormValid() 
var form=document.getElementById("form1"); 
from.jsObject=newObj; 
newObj.htmlObj=form; 
</script> 

También tengo una idea de usar motores de plantilla como Zparser para separar la vista y el modelo. Estoy desarrollando una biblioteca js para esto, así que estoy en esta pregunta ahora mismo.

Tenemos objeto central con método de la vista. Todas nuestras clases lo tienen como un prototipo al final. Este método obtiene plantillas propiedad de la clase y el uso de algunas plantillas de analizador genera HTML basándose en nuestro modelo. Este HTML se inserta en el nodo htmlObj para que se actualice la VISTA de nuestro objeto. Esto es básicamente una idea y nuestro código se convierte en:

// this is a part of some FormValid.js 
<script> 
function FormValid(){ 

} 
Components.extendCore(FormValid); 

FormValid.prototype.validate=function(){...} 
</script> 

FormValid.prototype.templates={ 
    main:'<form class="form1"...onsubmit="this.jsObject.validate();">...</form>' 
} 

//this is our HTML 
<div id="form1"></div> 
<script> 
Components.Attach("FormValid").to("form1"); 
</script> 

todavía creo última línea <script> debería estar allí y no es la mezcla de la lógica con la representación porque se trata de componentes - pieza sólida. No tiene sentido uno sin otro. En realidad, esto debería ser parte de la aplicación. Algo como html of component (en las un ejemplo es div) debe definirse y envolverse con un componente que agregará automáticamente scripts e id.

Ahora. Te mostré 2 ejemplos y explicaré por qué el segundo es demasiado específico.
Todo está en accesibilidad y rendimiento (y pérdidas de memoria). Si va a actualizar todo el html del componente con frecuencia, parpadeará, también necesitará volver a configurar todos los eventos dinámicos y verificar si hay fugas de memoria. Pero el problema principal si JS falla, su aplicación no mostrará nada.

Así que prefiero tener la opción entre los dos :) y usar todo en sus lugares.

+0

Los widgets/componentes ya están cubiertos por YUI, jQuery, ExtJS, Dojo, etc. y la pregunta sí preguntó acerca de los enfoques "aparte de" dichas bibliotecas. –

+0

Veo tu punto Djko! Por alguna razón, no tengo confianza en esta técnica. Me recuerda a un sucio ASPX + Code Behind, pero en este caso es como un código subyacente que se escribe directamente en la página ASPX (bueno, digamos que me olvidé de ). UI actúa como View y Controller al mismo tiempo. Y el modelo debe saber mucho para hacer cambios dinámicos en la interfaz de usuario (por ejemplo, cambiar su clase) ... ¿Tal vez podría dar algunos buenos ejemplos del mundo real con la demostración de esta idea? – Anvaka

+0

Entiendo sus preocupaciones, pero para el desarrollo del lado del cliente, la función de Javascript es trabajar con la IU. Por lo tanto, debe saber mucho al respecto e interactuar profundamente con él. Por otro lado, puedo mostrar un ejemplo en el que es posible separar vistas y modelos. Ver respuesta actualizada. –

4

Me gustaría recomendar Ross Harmes & El libro de Dustin Diaz, Pro JavaScript Design Patterns, definitivamente el mejor recurso sobre este tema, y ​​definitivamente vale la pena leerlo.

Hay ’ s también un artículo muy interesante sobre JavaScript MVC en la última edición de A List Apart.

+0

+1 en 2009, pero probablemente ya no sea cierto. Ese libro es de 2007, sin duda necesita urgentemente una actualización. Puede que quiera actualizar esta respuesta. He leído y disfrutado [JavaScript mantenible] (http://amzn.com/1449327680), que es excelente pero bastante corto. –

1

Un buen enfoque para la construcción de aplicación GUI es el de navegador:

  1. usando marcado para el diseño de la interfaz de usuario
  2. usando javascript lógica de la interfaz de usuario
  3. el uso de CSS para el estilo de interfaz de usuario

La mayor parte de Los modernos marcos de GUI (ExtJS, Dojo, etc.) ofrecen API que ayudan enormemente a construir GUI en JavaScript únicamente. Pero hay otro marco GUI Ample SDK que trae la separación de preocupaciones antes mencionada. Permite utilizar lenguajes basados ​​en XML (XHTML, XUL, SVG) para el diseño, CSS para el estilo y DOM API para la lógica de la interfaz de usuario.

para orquestar una aplicación de interfaz gráfica de usuario del lado del cliente puede utilizar MVC o un poco patrón más avanzada PAC, en cuanto a la ex - hay una aplicación PureMVC disponibles

Tome una mirada en el siguiente fragmento (sólo preocupaciones lógica de interfaz de usuario, no la lógica aplicación, para ser construido con MVC/PAC):

index.html

<script type="application/ample+xml"> 
    <xul:tabbox onselect="fOnSelect(event)" 
    xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> 
     <xul:tabs> 
      <xul:tab label="checkbox" /> 
      <xul:tab label="textbox" /> 
      <xul:tab label="datepicker" /> 
     </xul:tabs> 
     <xul:tabpanels> 
      <xul:tabpanel> 
       <xul:checkbox /> 
      </xul:tabpanel> 
      <xul:tabpanel> 
       <xul:textbox /> 
      </xul:tabpanel> 
      <xul:tabpanel> 
       <xul:datepicker /> 
      </xul:tabpanel> 
     </xul:tabpanels> 
    </xul:tabbox> 
</script> 

index.css

@namespace xul url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); 
xul|tab:focus { 
    color: red; 
} 

index.js

function fOnSelect(oEvent) { 
    alert(oEvent.currentTarget.selectedItems.length) 
} 
+0

Suena interesante. Me enteré por primera vez. ¿Sabes qué tan popular es este enfoque en JS World? Pensé que xul es un lenguaje que usan las aplicaciones de Mozilla (solo). – Anvaka

0

Salida un sitio llamado quince. No estoy seguro de cuántos patrones aquí son patrones javascript ui. Pero este es un recurso bastante bueno para los patrones de ui

+0

Gracias por esta referencia, Sandeep. Por lo que yo sé, Quince es sobre los mejores patrones de usabilidad. Y mi pregunta estaba relacionada con el enfoque arquitectónico, utilizado por la comunidad de JavaScript para organizar su capa de presentación. En cualquier caso, gracias de nuevo por mencionar esto :). – Anvaka

0

Los patrones no son siempre independientes del idioma. Muchos patrones de diseño clásicos no tienen sentido en JavaScript porque no necesitamos mucha solución que resuelvan en paradigmas de lenguaje más estrictos.

La razón por la que MVC no es tan apta para el desarrollo web del lado del cliente, sin embargo es más situacional.

En primer lugar, creo que el tiempo y el dolor han demostrado que las aplicaciones web típicas se tratan mejor como dos aplicaciones separadas. El que sucede en el navegador y el que sucede en el servidor. Cuantas menos dependencias establezca entre las dos, las aplicaciones web más flexibles, fáciles de mantener y más fáciles de modificar han sido modificadas según mi experiencia. La M es lógica de negocios (que las personas tienden a confundir de forma inexacta con la "capa de base de datos" IMO).

El problema con MVC en ese escenario es que no queremos exponer la lógica empresarial del lado del cliente y tratar de convertir toda la aplicación en una horrible construcción de división de http ha resultado dolorosa como mencioné.

Sin embargo, patrones muy similares en los que se pueden separar los datos o las preocupaciones de "ver modelo" pueden funcionar bastante bien.

Cuestiones relacionadas