2012-12-28 25 views
18

jsfiddle linke önce değer elde abone? Şu anda sadece bu değerleri ayrı ayrı almak için arayabilirim. Eski ve yeni değerler farklıysa bazı kodları tetiklemek istiyorum.Nakavt-2.2.0, değişim VE yeni değer

ben aşağıdakileri yapmanız herhalde, ama dağınık alabilirsiniz ... (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); 
​ 
+0

http://stackoverflow.com/questions/12822954/get-previous-value yanıtladıysanız -of-an-gözlemlenebilir-in-abone-of-the same-gözlemlenebilir – Nishanthan

cevap

0

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

gerçekten zannediyorsunuz eğer bilmiyorum arguments[0] kullanmak, ancak işe görünüyor.

Ayrıca daha temiz bir şekilde bunu gerçekleştirmek için kendi yöntemini kurmak olabilir

:

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); 
10

Bu

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

observable extender kullanmayı tercih ediyorum.

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

Örnek Kullanım:

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