2012-10-10 42 views
70

की सदस्यता ले में एक नमूदार के पिछले मूल्य प्राप्त करें कि नमूदार की सदस्यता के भीतर एक नमूदार के वर्तमान मूल्य प्राप्त करने के लिए नॉकआउट में क्या यह संभव है, इससे पहले कि यह नया मान प्राप्त करता है?ही नमूदार

उदाहरण:

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

उत्तर

77

इस तरह मूल्य से पहले करने के लिए एक सदस्यता करने के लिए एक तरीका नहीं है:

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

मैं ने पाया है कि मैं एक लिखने योग्य नमूदार अभिकलन से झांकना() कॉल कर सकते हैं पहले मूल्य प्राप्त करने के लिए।

कुछ इस तरह (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); 
    } 
}); 
+1

यह दुर्भाग्यवश काम नहीं करता है, क्योंकि जब तक सब्सक्राइब कॉलबैक कहा जाता है, तब तक मूल्य पहले ही बदल जाता है और इसलिए 'peek()' आपको नया मान देगा। –

+0

@MichaelTeper मैं मैं अपने जवाब एक साल पहले पोस्ट, लेकिन उसके बाद मैं कुछ downvotes मिला, मैं सिर्फ यह परीक्षण किया है पता है, और यह काम करता है। देखें: http://jsfiddle.net/4MUWp/ – rjmunro

+0

ठीक है, मैंने देखा कि आपने वहां क्या किया था ... सवाल 'सब्सक्राइब' कॉलबैक में मान को पुनर्प्राप्त करने के बारे में था जो peek() के साथ नहीं किया जा सकता है। आपका उदाहरण कुछ भी साबित नहीं करता है और एक नवागत को भ्रमित कर सकता है। आप मूल रूप से एक निजी चर यहाँ लपेटकर, और यह सेट करने से पहले अपने मूल्य को प्रदर्शित कर रहे हैं - तो निश्चित रूप से यह बदला हुआ नहीं होगा। –

128
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) { 

}); 
+12

इस शांत है, तो आप एक पुल अनुरोध किया? –

+2

काफी नई पीटकर करने, लेकिन मैं इस इच्छुक रहा हूँ जिस तरह से डिफ़ॉल्ट सदस्यता के सेटअप किया गया है। या .. यह एफएन कम से कम मेरे पहले खुजली खरोंच करेगा क्योंकि मैं पहली बार 'सब्सक्राइब' का उपयोग करता हूं। – bkwdesign

+0

https://github.com/knockout/knockout/issues/914 पर इस पर कुछ आंदोलन हुई है। ऐसा लगता है कि यह 3.4 रिलीज के लिए स्लेटेड है। – Aligned

15

Beagle90 जवाब देने के लिए छोटे परिवर्तन। उदाहरण के लिए निपटान() तक पहुंचने में सक्षम होने के लिए हमेशा सब्सक्रिप्शन को वापस करें।

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

pull request इस सुविधा को जोड़ने के लिए कुछ अलग कोड है कि 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() पर कॉल करते हैं)।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^