Istnieje kilka zalet używania funkcji do definiowania modelu widoku.
Główną zaletą jest to, że masz natychmiastowy dostęp do wartości this
równej tworzonej instancji. Oznacza to, że możesz:
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);
};
Zatem obliczona obserwowalna może zostać powiązana z odpowiednią wartością this
, nawet jeśli zostanie wywołana z innego zakresu.
Z literałem obiektu musiałbyś zrobić:
var viewModel = {
first: ko.observable("Bob"),
last: ko.observable("Smith"),
};
viewModel.full = ko.computed(function() {
return this.first() + " " + this.last();
}, viewModel);
W takim przypadku można użyć viewModel
bezpośrednio w obliczonym obserwowalnym, ale jest on oceniany natychmiast (domyślnie), więc nie można go zdefiniować w obrębie literału obiektu, ponieważ viewModel
nie jest definiowany, dopóki literał obiektu nie zostanie zamknięty. Wiele osób nie lubi, że tworzenie modelu widoku nie jest zawarte w jednym wywołaniu.
Innym wzorcem, którego można użyć w celu zapewnienia, że this
zawsze jest odpowiedni, jest ustawienie zmiennej w funkcji równej odpowiedniej wartości this
i użycie jej zamiast tego. To byłoby jak:
var ViewModel = function() {
var self = this;
this.items = ko.observableArray();
this.removeItem = function(item) {
self.items.remove(item);
}
};
Teraz, jeśli jesteś w zakresie pojedynczego elementu i wywołania $root.removeItem
, wartość this
będzie w rzeczywistości danymi powiązanymi na tym poziomie (który byłby przedmiotem). Używając self w tym przypadku, możesz upewnić się, że jest ona usuwana z ogólnego modelu widoku.
Inną opcją jest używanie bind
, które jest obsługiwane przez nowoczesne przeglądarki i dodawane przez KO, jeśli nie jest obsługiwane. W takim przypadku wyglądałoby to tak:
var ViewModel = function() {
this.items = ko.observableArray();
this.removeItem = function(item) {
this.items.remove(item);
}.bind(this);
};
Jest wiele więcej do powiedzenia na ten temat i wiele wzorców, które można zbadać (np. Wzorzec modułu i ujawnianie wzorca modułu), ale w zasadzie użycie funkcji daje większą elastyczność i kontrolę nad sposobem tworzenia obiektu oraz możliwością odniesienia zmienne, które są prywatne dla instancji.
prototype
(metody, które często, na przykład, pobierają dane z serwera i odpowiednio aktualizują model widoku). Jednak nadal możesz oczywiście zadeklarować je jako właściwość literału obiektu, więc tak naprawdę nie widzę różnicy.