剔除是否有可能在获取新观察值之前获取该观察值的预订中的当前值?
例:
this.myObservable = ko.observable();
this.myObservable.subscribe(function(newValue){
//I'd like to get the previous value of 'myObservable' here before it's set to newValue
});
Answers:
ko.subscribable.fn.subscribeChanged = function (callback) {
var oldValue;
this.subscribe(function (_oldValue) {
oldValue = _oldValue;
}, this, 'beforeChange');
this.subscribe(function (newValue) {
callback(newValue, oldValue);
});
};
像这样使用上面的代码:
MyViewModel.MyObservableProperty.subscribeChanged(function (newValue, oldValue) {
});
dispose()
功能gist.github.com/30ff1f5c1adf215179b0046515f86e45
Beagle90答案几乎没有变化。始终返回订阅本身,以便能够访问dispose()。
ko.subscribable.fn.subscribeChanged = function (callback) {
var oldValue;
this.subscribe(function (_oldValue) {
oldValue = _oldValue;
}, this, 'beforeChange');
var subscription = this.subscribe(function (newValue) {
callback(newValue, oldValue);
});
// always return subscription
return subscription;
};
.dispose
从中调用返回值将只处理第二个订阅,而不是'beforeChange'
订阅
该拉请求添加此功能有一些不同的代码,卷起比依靠使用更好的beforeChange
事件。
全部归功于Michael Best的解决方案
ko.subscribable.fn.subscribeChanged = function (callback) {
var savedValue = this.peek();
return this.subscribe(function (latestValue) {
var oldValue = savedValue;
savedValue = latestValue;
callback(latestValue, oldValue);
});
};
引用迈克尔:
我最初建议使用
beforeChange
解决此问题,但此后意识到它并不总是可靠的(例如,如果您调用valueHasMutated()
可观察对象)。
我发现我可以从可写的可计算观察对象中调用peek()来获取before值。
这样的事情(请参阅http://jsfiddle.net/4MUWp):
var enclosedObservable = ko.observable();
this.myObservable = ko.computed({
read: enclosedObservable,
write: function (newValue) {
var oldValue = enclosedObservable.peek();
alert(oldValue);
enclosedObservable(newValue);
}
});
peek()
将为您提供新值。
subscribe
回调中检索值,而使用peek()无法完成该回调。您的示例无法证明任何事实,并且可能会使新来者感到困惑。您基本上是在这里包装一个私有变量,并在设置它之前显示它的值-因此,它当然不会改变。
this
在这里代表什么?