Görünüm modelinizi tanımlamak için bir işlev kullanmanın birkaç avantajı vardır.
Ana avantajı, this
oluşturulan örneğe eşit olan bir değere anında erişebilmenizdir . Bu, şunları yapabileceğiniz anlamına gelir:
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);
};
Böylece, hesaplanan gözlemlenebiliriniz this
farklı bir kapsamdan çağrılsa bile uygun değerine bağlanabilir .
Bir nesne değişmeziyle şunları yapmanız gerekir:
var viewModel = {
first: ko.observable("Bob"),
last: ko.observable("Smith"),
};
viewModel.full = ko.computed(function() {
return this.first() + " " + this.last();
}, viewModel);
Bu durumda şunu kullanabilirsiniz viewModel
siz, nesnesi değişmez içinde tanımlamak olamazdı bu yüzden bilgisayarlı gözlemlenebilir doğrudan, ancak (varsayılan olarak) hemen değerlendirilir olsun demek viewModel
nesne değişmezi kapalı sonrasına kadar tanımlı değil. Birçok kişi, görünüm modelinizin oluşturulmasının tek bir çağrıda yer almamasını sevmez.
this
Her zaman uygun olmasını sağlamak için kullanabileceğiniz başka bir desen , işlevde uygun değere eşit bir değişken ayarlamak this
ve bunun yerine kullanmaktır. Bu şöyle olurdu:
var ViewModel = function() {
var self = this;
this.items = ko.observableArray();
this.removeItem = function(item) {
self.items.remove(item);
}
};
Şimdi, tek bir öğenin ve çağrının kapsamındaysanız $root.removeItem
, değeri this
aslında o düzeyde bağlanan veriler olacaktır (bu öğe olacaktır). Bu durumda kendini kullanarak, genel görünüm modelinden kaldırıldığından emin olabilirsiniz.
bind
Modern tarayıcılar tarafından desteklenen ve desteklenmiyorsa KO tarafından eklenen başka bir seçenek kullanmaktır . Bu durumda, şöyle görünecektir:
var ViewModel = function() {
this.items = ko.observableArray();
this.removeItem = function(item) {
this.items.remove(item);
}.bind(this);
};
Bu konuda söylenebilecek çok daha fazlası ve keşfedebileceğiniz birçok desen (modül deseni ve ortaya çıkan modül deseni gibi), ancak temel olarak bir işlevi kullanmak, nesnenin nasıl oluşturulduğu ve referans verme yeteneği üzerinde daha fazla esneklik ve kontrol sağlar. örneğe özel değişkenler.
prototype
(örneğin, sunucudan veri alır ve görünüm modelini buna göre günceller). Ancak bunları açıkça bir nesne değişmezinin bir özelliği olarak ilan edebilirsiniz, bu yüzden gerçekten bir fark göremiyorum.