Knockout-2.2.0, subscribe get value before change AND new value
knockout-2.0
Solution
I prefer using an observable extender.
http://jsfiddle.net/neonms92/xybGG/
Extender:
ko.extenders.withPrevious = function (target) {
// Define new properties for previous value and whether it's changed
target.previous = ko.observable();
target.changed = ko.computed(function () { return target() !== target.previous(); });
// Subscribe to observable to update previous, before change.
target.subscribe(function (v) {
target.previous(v);
}, null, 'beforeChange');
// Return modified observable
return target;
}
Example Usage:
// Define observable using 'withPrevious' extension
self.hours = ko.observable().extend({ withPrevious: 1 });
// Subscribe to observable like normal
self.hours.subscribe(function () {
if (!self.hours.changed()) return; // Cancel if value hasn't changed
print('Hours changed from ' + self.hours.previous() + ' to ' + self.hours());
});
Problem
jsfiddle link: http://jsfiddle.net/T8ee7/ When I call Knockout's subscribe method is there a way I can get both the previous and new value? Right now, I can only call get these values separately. I want to trigger some code if the old and new value are different. I suppose I could do the following, but it can get messy... (http://jsfiddle.net/MV3fN/) ``` var sv = sv || {}; sv.PagedRequest = function (pageNumber, pageSize) { this.pageNumber = ko.observable(pageNumber || 1); this.numberOfPages = ko.observable(1); this.pageSize = ko.observable(pageSize || sv.DefaultPageSize); }; var _pagedRequest = new sv.PagedRequest(); var oldValue; _pagedRequest.pageNumber.subscribe(function (previousValue) { console.log("old: " + previousValue); oldValue = previousValue; }, _pagedRequest, "beforeChange"); _pagedRequest.pageNumber.subscribe(function (newValue) { console.log("new: " + newValue); if (oldValue != newValue) { console.log("value changed!"); } }); _pagedRequest.pageNumber(10); _pagedRequest.pageNumber(20); ​ ```