2012-12-28 13 views
18

jsfiddle लिंक से पहले मूल्य प्राप्त सदस्यता ले? अभी, मैं केवल इन मानों को अलग से कॉल कर सकता हूं। यदि पुराना और नया मान अलग है तो मैं कुछ कोड ट्रिगर करना चाहता हूं।नॉकआउट-2.2.0, परिवर्तन और नए मूल्य

मुझे लगता है मैं निम्नलिखित कर सकता है लगता है, लेकिन यह गन्दा प्राप्त कर सकते हैं ... (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 में उत्तर दिया के- एक-नमूदार में सदस्यता ले-ऑफ-द-एक ही नमूदार – Nishanthan

उत्तर

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

मैं अगर तुम सच में चाहिए रहे हैं पता नहीं है 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); 
10

इस के लिए मुझे

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 का उपयोग करना पसंद करता हूं।

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()); 
}); 
संबंधित मुद्दे