2009-07-09 24 views
26

¿Alguien ha sido capaz de implementar el modelo MVP con cualquier marco de JavaScript? Tengo problemas para averiguar cómo tener el presentador -> ver inversión desde el código del servidor a javascript. Tengo algunas ideas, pero algo de hackish y me gustaría ver lo que otros están haciendo.Patrón de MVP con marco de JavaScript?

+2

¿Por qué? No soy de la vieja escuela, "JS es del tipo del diablo", pero incluso si tienes grandes aplicaciones del lado del cliente, no veo los beneficios, solo los gastos generales. – Boldewyn

+4

@Boldewyn, si no eres de la vieja escuela, considera que HTML5 y Javascript van uno al lado del otro. Si piensas que JS es "trabajo del diablo", entonces creo que nunca aprendiste el idioma. Es cierto que Javascript puede volverse muy complicado rápidamente, pero una vez estructurado, puede ser bastante poderoso y versátil. Además, TraceMonkey (Firefox) y V8 (Chrome) son bastante eficientes y en el futuro se lanzarán motores aún más rápidos. Y no menciono el hecho de que cada vez más aplicaciones se conectan en línea, y la ejecución del lado del cliente tiende a ser más del lado del servidor. Si no eres de la vieja escuela, debes saber todo esto ..... –

+0

@Yanick Rochon: En realidad, JavaScript es el lenguaje más encantador que conozco. Lo que quise decir es que no puedo ver los beneficios de un framework JS * MVP * que vaya más allá de un framework MVP * bien diseñado * del lado del servidor *. ¿Por qué hacerlo en el navegador y cargar todas las cosas, cuando también puedes hacerlo desde el servidor? – Boldewyn

Respuesta

0

Verificar PureMVC salir. También tienen puerto a JavaScript.

+0

Aunque MVC no es útil para aplicaciones del lado del cliente. Aconsejaría usar el patrón PAC en su lugar. –

+2

lea MVP, no MVC –

+0

@Yanick: MVC y MVP son muy similares y comparables en este contexto. –

0

Otra, para la gente de jQuery: http://javascriptmvc.com/

Sólo una nota que Ext JS también es compatible con el (x) patrón de MV desde la versión 4.0, que voy a mencionar como una persona ex-Ext. Al igual que la mayoría de los marcos, también lo llaman "MVC" (al igual que la mayoría de todos en el mundo de JS, consulte TodoMVC, en contraposición a TodoMVP). Sin embargo, desde un punto de vista práctico, las herramientas están ahí en Ext para implementar la parte C/P del patrón que mejor se adapte a sus necesidades. Los patrones son útiles, pero como casi todo, pueden limitar su pensamiento cuando se los trata dogmáticamente.

+1

Como su nombre lo indica, es MVC no MVP. – niutech

+0

@niutech Para todos los propósitos prácticos, MVC y MVP son conceptos intercambiables en el cliente, y cualquier biblioteca que afirme ser una u otra proporcionará ciertamente patrones de aplicación similares. La distinción entre "Controlador" y "Presentador" significa un poco más en el servidor, pero en el cliente no estoy seguro de que haya mucha diferencia. Quizás puedas iluminarme. –

+0

Creo que [esto] (http://stackoverflow.com/questions/4733700/what-is-the-difference-between-controller-in-mvc-pattern-and-presenter-in-mvp-pa) lo explica bien . En MVC, los modelos se comunican directamente con las vistas, mientras que en MVP, el presentador es el intermediario que escucha los eventos de los modelos y actualiza las vistas. – niutech

1

Salida proyecto angular en http://angularjs.org/ y no dude en hacer cualquier pregunta al grupo de correo.

Está diseñado para funcionar bien junto con jQuery. Muy útil para escribir aplicaciones TESTABLE MVC JS.

+0

La pregunta fue para MVP, porque Milan y Josh mencionaron a MVP, MVVM, y como un loro esta respuesta? En primer lugar, Angular es/puede ser MV * Lo que sea. Por lo tanto, es posible que haya engañado a algunos ingenieros, y luego sugiera utilizarlo para crear una MVC APP :-p – blamb

6

Eche un vistazo a knockout.js que es un marco MVVM para sus páginas web. Proporciona un marco realmente hermoso y fácilmente extensible para vincular un modelo y una vista de una manera débilmente acoplada.

+3

¿Cómo explica eso a MVP? :) – mcmlxxxiii

+1

Claramente no, pero siempre he evitado ser el tipo pedante. Me imagino que si su pregunta es: "Tengo una aplicación MVP exitosa escrita con Windows Forms, y una aplicación MVVM que me gusta en la pila de iOS, y ahora tengo algunas preguntas detalladas sobre MVP en JS", entonces puede hablar dentro de los detalles de MVP vs MVC vs MVVM (en el cual no respondería con autoridad (siendo educadamente ignorante)). Pero '¿cómo hago MVP sin hacer un lío?' es el tipo de consulta en la que creo que las respuestas MV * son apropiadas. Espero que sea útil y agregue claridad :) – JoshRivers

+0

@JoshRivers gracias, sí, es un poco útil, estoy tratando de ver las principales diferencias en la estructuración de los frameworks JS. – blamb

45

El objetivo principal con MVP es el desacoplamiento de diferentes aspectos en el código. Normalmente, en JavaScript, hay 3 principales tales aspectos:

  1. Manejo de Eventos
  2. manipulación DOM
  3. comunicación Server (llamadas AJAX)

Para cada una de estas preocupaciones, hay un término correspondiente de MVP:

  1. EventHandling = Presentador
  2. DOM Manipulación = Ver
  3. llamadas AJAX = Modelo

Dado que de hecho no siempre es fácil de implementar los 3 aspectos, un bus de eventos puede ser útil. Este autobús debe ser un singleton y todos los eventos, planteados en diversos contextos, deben publicarse en el autobús. El Presentador necesita registrarse en sus eventos y reaccionar en consecuencia cuando ocurren los eventos.

Aquí es cómo funcionaría:

lo primero que ocurre es la carga de la página. Escuche esto usando el modelo de evento normal o jQuery o lo que sea conveniente. Crea el modelo, la vista y el presentador. El Presentador necesita mantener las instancias de Vista y Modelo ya que él las usará.

var model = new Model(); 
var view = new View(); 
var presenter = new Presenter(model, view); 

Recuerde que Presenter es el controlador de eventos para que el autobús debe saber sobre él y eventos de la ruta a la misma para la manipulación:

bus.registerHandler(presenter); 

El primer evento es el "init", lo que significa que la página tiene objetos cargados y el MVP está todo listo:

bus.init(); // call this yourself 

Esto daría lugar a algo en el presentador, como una función. Prefiero la convención de nomenclatura ..., en este ejemplo presenter.onInit(). Esto le da la oportunidad de instalar los oyentes de interfaz de usuario:

// in the Presenter 
onInit: function() { 
    view.addSubmitListener(); 
    view.addWhateverListener(); 
    ... 
} 

// in the View (using jQuery) 
addSubmitListener: function() { 
    $("#submitButton").click(function() { 
    var formData = ... 
    bus.submit(formData); // publish an event to the bus 
    }); 
} 

Cuando el botón Enviar se hace clic en el bus.submit (FormData) se llama y esta voluntad es la ruta al controlador - presenter.onSubmit (FormData):

// in the Presenter 
onSubmit: function(formData) { 
    model.postForm(formData, function(data) { 
    // handle the response 
    view.updateSomething(data); 
    }); 
} 

Y así sucesivamente ... Todo el truco es atar el autobús al presentador y luego estás en el circuito.

HTH

+0

En caso de que mi respuesta aquí no fuera lo suficientemente clara, escribí esta publicación para explicar mejor el [MVP con JavaScript] (http://neovibrant.com/2011/08/03/mvp-with-javascript/). Dejé el autobús fuera porque no es parte de MVP. – Neovibrant

+0

En lugar de usar un bus, suelo usar una función auxiliar que amplía las vistas y los modelos para que sean emisores de eventos. Los modelos emiten eventos cuando los datos cambian y las vistas emiten eventos en la entrada del usuario. – download

1

Sé que esta pregunta es viejo, pero creo que vale la pena mencionar aquí. Mi voto va a Backbone.js. Incluso los documentos dicen que es MVC, diría que es MVP.

  • VISTA = plantilla HTML (jQuery.template)
  • Modelo = Backbone.Model
  • PRESENTADOR = Backbone.View (capa entre su vista, tempate y la forma de los datos a ella ligada, y más que adelgaza puede hacer) y lo que es mejor que se puede utilizar en rendir vistas método par (plantillas hTML) o interruptor que utilizar ...

y lo que es mejor todavía tiene controlador

  • CONTROLADOR = Backbone.Controller

alternativa podría ser tan @JoshRivers mencionan, knockoutJS pero mi opinión personal es que la plantilla de vista es abrumado con la materia de la unión.

Y última nota. La cosa es Ver como V, ya sea desde MVC o MVP, es algo que puede construirse desde su plantilla sin codificarlo, hacer un buen analizador de plantillas HTML y está listo para ir :) Créanme, la convención es su amiga.

+0

Gracias por mencionar knockoutJS. – Marcel

+0

Gracias interesante. Estoy tratando de entender más acerca de las diferencias ¿Alguien sostiene que backbone.js puede ser MVP? – blamb

0

Estamos hablando de MVP personas aquí! ¡No MVC! En mi opinión, la industria aún no está lista para MVP. Todos todavía están tratando de captar MVC.

+1

Lamentablemente, estoy de acuerdo. La mayoría no lo entiende, no es tan complicado, y simplifica y hace las cosas mucho más consistentes. – Joel

0

Eche un vistazo a Riot.js - una nueva, autónoma MVB micribiblioteca de 1kB (!) Que tiene todo lo que necesita para construir una aplicación de JavaScript escalable y modular. También hay una demostración en toda regla.

0

estaba buscando algunos ejemplos de marcos de MVP y chocó en este enlace que podría ser muy útil para decidir sobre el marco que se quiere trabajar en: MV* Frameworks