2009-07-09 9 views
26

Hat jemand das MVP-Modell mit JavaScript-Frameworks implementieren können? Ich habe Probleme herauszufinden, wie man den Moderator hat -> Inversion von Server-Code zu Javascript. Ich habe einige Ideen, aber irgendwie hackish und würde gerne sehen, was andere tun.MVP-Muster mit Javascript-Framework?

+2

Warum? Ich bin keine alte Schule "JS ist Teufels Arbeit" Typ, aber selbst wenn Sie große clientseitige Apps haben, sehe ich nicht die Vorteile, sondern nur den Overhead. – Boldewyn

+4

@Boldewyn, Wenn Sie nicht old school sind, dann beachten Sie, dass HTML5 und Javascript genau aufeinander folgen. Wenn Sie denken, dass JS "Teufelswerk" ist, dann denke ich, dass Sie die Sprache nie gelernt haben. Es stimmt, Javascript kann schnell sehr unordentlich werden, aber sobald es einmal strukturiert ist, kann es ziemlich mächtig und vielseitig sein. Plus, TraceMonkey (Firefox) und V8 (Chrome) sind ziemlich effizient, und in Zukunft werden noch schnellere Motoren erscheinen. Und ich erwähne nicht die Tatsache, dass immer mehr Anwendungen online gehen und die Client-seitige Ausführung über die Serverseite hinausgeht. Wenn Sie keine alte Schule sind, sollten Sie das alles wissen ..... –

+0

@Yanick Rochon: Eigentlich ist JavaScript die schönste Sprache, die ich kenne. Was ich damit meinte, ist, dass ich die Vorteile eines JS * MVP * Frameworks nicht sehen kann, das über ein well-design * serverseitiges * MVP Framework hinausgeht. Warum mach es im Browser und lade alle Sachen, wenn du es auch serverseitig machen kannst? – Boldewyn

Antwort

0

Überprüfen Sie PureMVC aus. Sie haben auch Anschluss an JavaScript.

+0

Obwohl MVC nicht für clientseitige Anwendungen geeignet ist. Ich würde stattdessen empfehlen, PAC-Muster zu verwenden. –

+2

lesen MVP, nicht MVC –

+0

@ Yanick: MVC und MVP sind sehr ähnlich und in diesem Zusammenhang vergleichbar. –

0

Ein weiterer, für jQuery Leute: http://javascriptmvc.com/

Nur ein Hinweis, dass Ext JS unterstützt auch die MV (x) Muster seit Version 4.0, die ich als Ex-Ext Person erwähnen würde. Wie die meisten Frameworks nennen sie auch "MVC" (wie die meisten anderen in der JS-Welt, siehe TodoMVC, im Gegensatz zu TodoMVP). Aus praktischer Sicht sind die Werkzeuge in Ext vorhanden, um den C/P-Teil des Musters so zu implementieren, wie es Ihren Anforderungen am besten entspricht. Muster sind nützlich, aber wie die meisten anderen Dinge können Sie Ihr Denken einschränken, wenn Sie dogmatisch behandelt werden.

+1

Wie der Name sagt, ist es MVC nicht MVP! – niutech

+0

@niutech Für alle praktischen Zwecke sind MVC und MVP austauschbare Konzepte auf dem Client, und jede Bibliothek, die behauptet, die eine oder andere zu sein, wird sicherlich ähnliche Anwendungsmuster bereitstellen. Die Unterscheidung zwischen "Controller" und "Presenter" bedeutet ein bisschen mehr auf dem Server, aber auf dem Client bin ich mir nicht sicher, dass es eine große Unterscheidung gibt. Vielleicht kannst du mich aufklären. –

+0

Ich denke [http://stackoverflow.com/questions/4733700/what-is-the-difference-between-controller-in-mvc-pattern-and-presenter-in-mvp-pa) erklärt es gut . In MVC kommunizieren Modelle direkt mit Ansichten, während in MVP der Moderator der mittlere Mann ist, der die Ereignisse der Modelle überwacht und Ansichten aktualisiert. – niutech

1

Check out Winkel Projekt http://angularjs.org/ und fühlen sich frei, jede mögliche Frage zu Mailing-Gruppe zu stellen.

Es wurde entwickelt, um gut mit jQuery zusammen zu arbeiten. Sehr nützlich für das Schreiben von TESTABLE MVC JS-Anwendungen.

+0

Frage war für MVP, denn Milan und Josh erwähnten MVP, MVVM und wie ein Papagei diese Antwort? Vor allem ist/ist Angular MV * Was auch immer. Vielleicht haben Sie also ein paar Ingenieure in die Irre geführt, und dann schlagen Sie vor, sie zu benutzen, um eine MVC-APP zu erstellen :-p – blamb

6

Werfen Sie einen Blick auf knockout.js, die ein MVVM-Framework für Ihre Webseiten ist. Es bietet ein wirklich schönes und leicht erweiterbares Framework für die lose Kopplung eines Modells und einer Ansicht.

+3

Wie erklärt das MVP? :) – mcmlxxxiii

+1

Offensichtlich nicht, aber ich habe immer vermieden, der pedantische Typ zu sein. Ich denke, Ihre Frage lautet: "Ich habe eine erfolgreiche MVP-Anwendung mit Windows Forms geschrieben, und eine MVVM-Anwendung, die ich auf dem iOS-Stack mag, und jetzt habe ich einige detaillierte Fragen zu MVP auf JS", dann kann innerhalb der Details von MVP gegen MVC gegen MVVM sprechen (in denen ich nicht autoritativ antworten würde (in Kenntnis der Unwissenheit)). Aber "Wie mache ich MVP, ohne ein Durcheinander zu machen?" ist die Art von Abfrage, wo ich denke, MV * Antworten sind angemessen. Ich hoffe, dass das hilfreich ist und Klarheit bringt :) – JoshRivers

+0

@JoshRivers danke, ja, es ist irgendwie hilfreich, ich versuche große Unterschiede bei der Strukturierung von JS-Frameworks zu erkennen. – blamb

45

Das Hauptziel bei MVP ist die Entkopplung verschiedener Aspekte im Code. Normalerweise in JavaScript gibt drei wichtige solche Aspekte sind:

  1. Ereignis
  2. DOM-Manipulation
  3. Server Kommunikation Handling (AJAX-Aufrufe)

Für jede dieser Bedenken gibt es einen entsprechenden Begriff von MVP:

  1. Ereignisbehandlung = Moderator
  2. DOM-Manipulation = Ansicht
  3. AJAX-Aufrufe = Modell

Da in der Tat ist es nicht immer einfach ist, die drei Aspekte zu implementieren, kann ein Ereignis BUS sich als nützlich. Dieser Bus sollte ein Singleton sein und alle Ereignisse, die in verschiedenen Kontexten angesprochen werden, sollten im Bus veröffentlicht werden. Der Präsentator muss sich bei seinen Ereignissen registrieren und entsprechend reagieren, wenn Ereignisse eintreten.

Hier ist, wie es funktionieren würde:

Das erste, was die Seite zu laden, ist passiert. Hören Sie dies mit dem normalen Event-Modell oder jQuery oder was auch immer ist bequem. Erstelle das Model, die View und den Presenter. Der Presenter muss die View- und Model-Instanzen halten, da er sie verwenden wird.

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

Denken Sie daran, dass Presenter der Ereignishandler ist so der Bus über sie und Ereignisse entlang der Route, um es für die Handhabung wissen sollten:

bus.registerHandler(presenter); 

Das erste Ereignis ist die „init“, was bedeutet, die Seite hat geladen und sind die MVP alle Objekte gesetzt:

bus.init(); // call this yourself 

das ist etwas in dem Moderator, wie eine Funktion auslösen würde. Ich bevorzuge die Namenskonvention on, in diesem Beispiel presenter.onInit(). Daraus ergibt sich eine Chance UI Zuhörer zu installieren:

// 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 
    }); 
} 

Wenn die Schaltfläche Senden die bus.submit geklickt wird (Formdata) aufgerufen wird und diese leitet sie an den Handler - presenter.onSubmit (Formdata):

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

Und so weiter ... Der ganze Trick ist die Bindung des Busses an den Presenter und dann bist du in der Schleife.

HTH

+0

Falls meine Antwort hier nicht klar genug war, schrieb ich diesen Beitrag, um das [MVP mit JavaScript] (http://neovibrant.com/2011/08/03/mvp-with-javascript/) besser zu erklären. Ich verlasse den Bus, da das nicht Teil von MVP ist. – Neovibrant

+0

Anstatt einen Bus zu verwenden, verwende ich normalerweise nur eine Hilfsfunktion, die die Ansichten und Modelle zu Ereignisemittern erweitert. Die Modelle geben Ereignisse aus, wenn sich Daten ändern, und die Ansichten geben Ereignisse über Benutzereingaben aus. – download

1

Ich weiß, diese Frage ist alt, aber ich denke, es ist hier erwähnenswert ist. Meine Stimme geht an Backbone.js. Sogar die Docs sagen, es ist MVC, ich würde sagen, es ist MVP.

  • VIEW = html-Vorlage (jQuery.template)
  • MODEL = Backbone.Model
  • VORFÜHRER = Backbone.View (Schicht zwischen Ihrer Sicht-tempate und wie die Daten, um es gebunden ist, und mehr lichtet Sie tun kann) und, was am besten Sie verwenden in kann Methode Paar Ansichten (hTML Vorlagen) oder Schalter machen die ...

zu verwenden und was ist am besten Sie noch Controller haben

    =
  • CONTROLLER Backbone.Controller

Alternative könnte sein, wie @JoshRivers erwähnt, knockoutJS aber meine persönliche Meinung ist, dass View-Template mit Bindung Sachen überwältigt ist.

Und letzte Anmerkung. Thing ist View as V von MVC oder MVP ist etwas, das aus Ihrer Vorlage erstellt werden kann, ohne es zu programmieren, gute HTML-Vorlage Parser zu machen und Sie sind gut zu gehen :) Glauben Sie mir, Konvention ist dein Freund.

+0

Danke für die Erwähnung von knockoutJS. – Marcel

+0

Danke interessant. Ich versuche, mehr über die Unterschiede zu verstehen. Darf jemand argumentieren, dass backbone.js MVP sein kann? – blamb

0

Wir sprechen über MVP hier Leute! Nicht MVC! Meiner Meinung nach ist die Branche noch nicht bereit für MVP. Jeder versucht MVC zu erfassen.

+1

Leider stimme ich zu. Die meisten verstehen es nicht, es ist nicht so kompliziert und es vereinfacht und macht die Dinge viel konsistenter. – Joel

0

Werfen Sie einen Blick auf Riot.js - eine brandneue, eigenständige 1kB (!) MVP-Microlibrary, die alles enthält, was Sie benötigen, um eine skalierbare, modulare JavaScript-App zu erstellen. Es gibt auch eine ausgewachsene Demo.

0

wurde für einige Beispiele für MVP-Frameworks gesucht und in diesen Link gestoßen, die sehr nützlich sein, einer auf dem Rahmen zu entscheiden, will arbeiten: MV* Frameworks