web-dev-qa-db-ja.com

ノックアウト-2.2.0、サブスクライブ変更前の値と新しい値の取得

jsfiddleリンク: http://jsfiddle.net/T8ee7/

Knockoutのsubscribeメソッドを呼び出すと、以前の値と新しい値の両方を取得する方法はありますか?今のところ、これらの値を個別に取得することしかできません。古い値と新しい値が異なる場合に、いくつかのコードをトリガーしたいと思います。

私は次のことができると思いますが、それは厄介になる可能性があります...( 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);
​
18
Abe

監視可能なエクステンダー を使用することをお勧めします。

http://jsfiddle.net/neonms92/xybGG/

エクステンダー:

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;
}

使用例:

// 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());
});
22
Nathan

これは私にとってはうまくいくようです

ko.observable.fn.beforeAndAfterSubscribe = function (callback, target) {
 var _oldValue;
 this.subscribe(function (oldValue) {
     _oldValue = oldValue;
 }, null, 'beforeChange');
   this.subscribe(function (newValue) {
     callback.call(target, _oldValue, newValue);
 });
}; 
10
Maslow

http://jsfiddle.net/MV3fN/3/

var sv = sv || {};
sv.PagedRequest = function (pageNumber, pageSize) {
    var self = this;
    self.pageNumber = ko.observable(pageNumber || 1);
    self.numberOfPages = ko.observable(1);
    self.pageSize = ko.observable(pageSize || sv.DefaultPageSize);

    self.pageNumber.subscribe(function (previousValue) {
        console.log(previousValue);
        console.log(self.pageNumber.arguments[0]);
        if (previousValue != _pagedRequest.pageNumber.arguments[0]) {
            console.log('value changed');
        } 
        else {
            //This won't get executed because KO doesn't
            //call the function if the value doesn't change
            console.log('not changed');
        }
    }, _pagedRequest, "beforeChange");
};

var _pagedRequest = new sv.PagedRequest();

_pagedRequest.pageNumber(10);
_pagedRequest.pageNumber(20);
_pagedRequest.pageNumber(20);
_pagedRequest.pageNumber(5);

本当にarguments[0]を使用することになっているのかどうかはわかりませんが、機能しているようです。

これをはるかにクリーンな方法で実現するために、独自のメソッドを設定することもできます。

http://jsfiddle.net/PXKgr/2/

...
    self.setPageNumber = function(page) {
        console.log(self.pageNumber());
        console.log(page);
        if (self.pageNumber() != page) {
            console.log('value changed');
        }
        else {
            console.log('not changed');
        }
        self.pageNumber(page);
    };
...
_pagedRequest.setPageNumber(10);
_pagedRequest.setPageNumber(20);
_pagedRequest.setPageNumber(20);
_pagedRequest.setPageNumber(5);
0
Brian Adams