Die Verwendung einer Funktion zum Definieren Ihres Ansichtsmodells bietet einige Vorteile.
Der Hauptvorteil besteht darin, dass Sie sofort auf einen Wert zugreifen können, der this
der erstellten Instanz entspricht. Dies bedeutet, dass Sie Folgendes tun können:
var ViewModel = function(first, last) {
this.first = ko.observable(first);
this.last = ko.observable(last);
this.full = ko.computed(function() {
return this.first() + " " + this.last();
}, this);
};
So kann Ihr berechnetes Observable an den entsprechenden Wert von gebunden werden this
, selbst wenn es aus einem anderen Bereich aufgerufen wird.
Mit einem Objektliteral müssten Sie Folgendes tun:
var viewModel = {
first: ko.observable("Bob"),
last: ko.observable("Smith"),
};
viewModel.full = ko.computed(function() {
return this.first() + " " + this.last();
}, viewModel);
In diesem Fall können Sie viewModel
das berechnete Observable direkt verwenden, es wird jedoch sofort (standardmäßig) ausgewertet, sodass Sie es nicht innerhalb des Objektliteral definieren können, wie viewModel
es erst nach dem Schließen des Objektliterals definiert wird. Vielen Leuten gefällt es nicht, dass die Erstellung Ihres Ansichtsmodells nicht in einem Aufruf zusammengefasst ist.
Ein weiteres Muster, mit dem Sie sicherstellen können, dass this
es immer angemessen ist, besteht darin, eine Variable in der Funktion auf den entsprechenden Wert von zu setzen this
und sie stattdessen zu verwenden. Das wäre wie folgt:
var ViewModel = function() {
var self = this;
this.items = ko.observableArray();
this.removeItem = function(item) {
self.items.remove(item);
}
};
Wenn Sie sich nun im Bereich eines einzelnen Elements befinden und aufrufen $root.removeItem
, ist der Wert von this
tatsächlich die Daten, die auf dieser Ebene gebunden werden (was das Element wäre). Wenn Sie in diesem Fall self verwenden, können Sie sicherstellen, dass es aus dem Gesamtansichtsmodell entfernt wird.
Eine andere Option ist die Verwendung bind
, die von modernen Browsern unterstützt und von KO hinzugefügt wird, wenn sie nicht unterstützt wird. In diesem Fall würde es so aussehen:
var ViewModel = function() {
this.items = ko.observableArray();
this.removeItem = function(item) {
this.items.remove(item);
}.bind(this);
};
Zu diesem Thema kann noch viel mehr gesagt werden, und es gibt viele Muster, die Sie untersuchen können (z. B. Modulmuster und Aufdecken von Modulmustern). Die Verwendung einer Funktion bietet Ihnen jedoch mehr Flexibilität und Kontrolle darüber, wie das Objekt erstellt wird und wie Sie darauf verweisen können Variablen, die für die Instanz privat sind.
prototype
(Methoden, die beispielsweise häufig Daten vom Server abrufen und das Ansichtsmodell entsprechend aktualisieren). Sie können sie jedoch offensichtlich immer noch als Eigenschaft eines Objektliteral deklarieren, sodass ich keinen wirklichen Unterschied sehe.