I already asked this question auf einer anderen Website, aber da es kaum Aufmerksamkeit (geschweige denn eine Antwort) bekam, hoffte ich, dass es hier hineinpassen könnte.JavaScript - Clientseitige Trennung von Model und ViewModel?
Ich entwickle Web-Apps mit dem Modell-View-ViewModel Ansatz mit Knockout.js. Nach dem Lesen auf der original introduction of MVVM von John Gossman, erkannte ich, dass mein ViewModel immer die gesamte Logik der App enthält, nicht nur UI-Logik, sondern alles.
Ich habe irgendwo gelesen, dass mit Knockout, das Modell als die Datenbank oder allgemein die Daten auf dem Server betrachtet wird. Aber nach MVC enthält das Modell auch Funktionen, die etwas mit diesen Daten verarbeiten und nicht UI-bezogen sind.
Also fragte ich mich, ob es sinnvoll wäre, ein separates Model-Objekt unabhängig vom ViewModel-Objekt zu haben? Die Idee dahinter wäre, dass das ViewModel nur UI-Logik (wie von Gossman beabsichtigt) enthält und das Modell nur Business-Logik (wie in MVC) enthalten würde, die nichts mit der tatsächlichen View zu tun hat. Beispiel:
var viewModel = {
hint: ko.observable("idle"), //text visible in the View
buttonClicked: function() {
this.hint("doing stuff");
model.doStuff();
this.hint("done");
}
};
var model = {
doStuff: function() {
//business logic, UI independent
}
};
Gibt es eine Empfehlung oder "Best Practice", die aus der MVVM-Musterdefinition abgeleitet werden kann?
Ich kann nicht sagen, ob es als Best Practice betrachtet wird oder ob es von irgendeinem Muster abgeleitet ist, aber diese "Architektur" ist besonders in größeren Projekten sehr praktisch, da die Logik im Modell selbst nur spezifische Funktionalität für das Modell, das wiederholt in mehreren Ansichtsmodellen für verschiedene Zwecke verwendet werden kann. Die Logik für Model und Viewmodel zu trennen, wird definitiv keinen Schaden anrichten. – Martin
Für mich ist es keine Best Practice, es ist fast eine Voraussetzung. Wenn Ihre Logik komplex wird, werden Ihre Ansichtsmodelle unlesbar, wenn Sie Geschäftslogik und UI-Logik nicht teilen. Außerdem erleichtert es das Fehlermanagement, da es Schichten trennt –