एक ही देखने योग्य की सदस्यता में एक नमूदार का पिछला मूल्य प्राप्त करें


85

क्या नए मान प्राप्त करने से पहले, उस अवलोकन योग्य सदस्यता के भीतर अवलोकन योग्य वर्तमान मूल्य प्राप्त करना संभव है?

उदाहरण:

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

जवाबों:


88

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

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

यहाँ क्या है this?
थानैसिस आयोनिडिस

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

});

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

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

2
यदि सब्स्क्राइब्ड ऑब्जर्वेबल वैल्यू टाइप एक एरे है, तो आपको इसे स्लाइस करना होगा, अन्यथा ओल्डवैल्यू हमेशा न्यूवैल्यू की तरह ही रहेगा। एक कार्यशील उदाहरण की जाँच करें, यहाँ: jsfiddle.net/david_freire/xmk6u9yn/4
डेविड फ्रायर

1
ठंडा। एक रिटर्न वैल्यू जोड़ा जो एक dispose()फंक्शन के साथ एक सब्सक्रिप्शन ऑब्जेक्ट है। gith.github.com/30ff1f5c1adf215179b0046515f86e45
माइकल

ओह बस गिट वार्तालाप देखा।
माइकल

21

बीगल 90 उत्तर के लिए थोड़ा बदलाव। उदाहरण के लिए डिस्पोज़ () का उपयोग करने में सक्षम होने के लिए हमेशा सदस्यता को ही वापस करें।

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

1
यह एक वास्तविक कदम है, लेकिन कॉल .disposeदूसरा सदस्यता के केवल निपटाने इस से वापसी मान पर होगा, नहीं 'beforeChange'सदस्यता
TRManderson

18

पुल अनुरोध इस सुविधा को जोड़ने के लिए कुछ अलग कोड का उपयोग पर निर्भर तुलना में बेहतर होने तक हवाएँ है beforeChangeघटना।

माइकल बेस्ट के समाधान का सारा श्रेय

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()अवलोकन योग्य हैं)।


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()आपको नया मूल्य देगा।
माइकल टेपर

@MichaelTeper मुझे पता है कि मैंने अपना उत्तर एक साल पहले पोस्ट किया था, लेकिन कुछ डाउनवोट मिलने के बाद, मैंने इसे अभी-अभी परीक्षण किया है, और यह काम करता है। देखें: jsfiddle.net/4MUWp
rjmunro

ठीक है मैं देख रहा हूं कि आपने वहां क्या किया था ... सवाल एक subscribeकॉलबैक में मूल्य को पुनः प्राप्त करने के बारे में था जो कि तिरछी नज़र से नहीं किया जा सकता है ()। आपका उदाहरण कुछ भी साबित नहीं करता है और एक नवागंतुक को भ्रमित कर सकता है। आप मूल रूप से एक निजी चर को यहां लपेट रहे हैं, और इसे स्थापित करने से पहले इसके मूल्य को प्रदर्शित करते हैं - इसलिए निश्चित रूप से यह नहीं बदला होगा।
सिमोन_विवर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.