ノックアウトでは、新しい値を受け取る前に、オブザーバブルのサブスクリプション内でオブザーバブルの現在の値を取得することはできますか?
例:
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
});
次のようにbefore値へのサブスクリプションを行う方法があります。
this.myObservable = ko.observable();
this.myObservable.subscribe(function(previousValue){
//I'd like to get the previous value of 'myObservable' here before it's set to newValue
}, this, "beforeChange");
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) {
});
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;
};
この機能を追加する プルリクエスト には、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
を使用してこの問題を解決することを提案しましたが、それが常に信頼できるとは限らないことに気付きました(たとえば、observableでvalueHasMutated()
を呼び出す場合)。
Before値を取得するために、書き込み可能な計算可能オブザーバブルからpeek()を呼び出すことができることがわかりました。
このようなもの( 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);
}
});