嗯,我有extender做了以下方法:
ko.extenders.preloadImage = function(target, lazyImage) {
var preloadedImage = null;
var lazyLoadImage = lazyImage || "img/ajax-loader.gif";
//create a writeable computed observable to intercept writes to our observable
var result = ko.computed({
read: target, //always return the original observables value
write: function(newValue) {
var current = target();
if(newValue == lazyLoadImage || newValue == preloadedImage) {
valueToWrite = newValue;
} else {
preloadedImage = newValue;
valueToWrite = lazyLoadImage;
$('<img />').attr('src', newValue).load(function() {
valueToWrite = newValue;
preloadedImage = null;
target(valueToWrite);
target.notifySubscribers(valueToWrite);
});
}
//only write if it changed
if (valueToWrite !== current) {
target(valueToWrite);
} else {
//if the rounded value is the same, but a different value was written,
// force a notification for the current field
if (newValue !== current) {
target.notifySubscribers(valueToWrite);
}
}
}
});
//initialize with current value
result(target());
//return the new computed observable
return result;
};
而且你可以用它的方式如下:
var BookModel = function(data) {
var self = this;
self.id = ko.observable(data.id);
self.title = ko.observable(data.title);
self.pages = ko.observable(data.pages);
self.pictureURL = ko.observable(data.pictureURL).extend({ preloadImage : null });
};
它與默認img/ajax-loader.gif
圖片或其他圖片你作爲lazyImage
參數傳遞。基本上,無論何時要顯示新圖片,都會顯示延遲加載gif。只有在瀏覽器預加載了原始圖片的情況下才會顯示在屏幕上。
這並不是很多,但它可能有助於KnockoutJS愛好者在這裏:-) 此外,如果你認爲它可能會更好,請編輯代碼。