একই পর্যবেক্ষণযোগ্য সাবস্ক্রাইব একটি পর্যবেক্ষণযোগ্য আগের মান পেতে


86

নতুন মান পাওয়ার আগেই কি সেই পর্যবেক্ষণযোগ্য সাবস্ক্রিপশনের মধ্যে পর্যবেক্ষণযোগ্য বর্তমান মানটি পাওয়া সম্ভব হবে?

উদাহরণ:

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এখানে কি বোঝায়?
থানাসিস ইওনানিডিস

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

});

4
নকআউট করার ক্ষেত্রে মোটামুটি নতুন, তবে আমি এটিই ডিফল্ট সাবস্ক্রাইবটি সেটআপ করার পদ্ধতিতে চাই। বা .. এই প্রথমবারের মতো আমি 'সাবস্ক্রাইব' ব্যবহার করায় এই এফএন কমপক্ষে আমার প্রথম চুলকানি স্ক্র্যাচ করবে।
bkwdesign

4
Github.com/knockout/knockout/issues/914 এ নিয়ে কিছুটা আন্দোলন হয়েছে । দেখে মনে হচ্ছে এটি 3.4 প্রকাশের জন্য রয়েছে for
এএম এ্যালাইন্ডডেভ

4
সাবস্ক্রাইব করা পর্যবেক্ষণযোগ্য মানের ধরণ যদি অ্যারে হয় তবে আপনার এটি কেটে ফেলা উচিত, অন্যথায় পুরানোভ্যালু সর্বদা নতুন মূল্য হিসাবে সমান হবে। একটি কার্যকারী উদাহরণ এখানে দেখুন: jsfiddle.net/david_freire/xmk6u9yn/4
ডেভিড

4
শীতল। একটি রিটার্ন মান যোগ করা হয়েছে যা একটি dispose()ফাংশন সহ gis.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;
};

4
এটি একটি বাস্তব পদক্ষেপ আপ, কিন্তু কলিং .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);
    }
});

4
দুর্ভাগ্যক্রমে, যেহেতু সাবস্ক্রাইব কলব্যাক কল হওয়ার পরে, মানটি ইতিমধ্যে পরিবর্তিত হয়েছে এবং peek()এটি আপনাকে নতুন মান দেয়।
মাইকেল টেপার

@ মিশেলটিপার আমি জানি আমি এক বছর আগে আমার উত্তর পোস্ট করেছি, তবে কিছুটা ডাউনবোট পাওয়ার পরে আমি কেবল এটি পরীক্ষা করেছি এবং এটি কার্যকর হয়েছে। দেখুন: jsfiddle.net/4MUWp
rjmunro

ঠিক আছে আমি দেখছি আপনি সেখানে কী করেছেন ... প্রশ্নটি একটি subscribeকলব্যাকের মানটি পুনরুদ্ধার সম্পর্কে যা পিক () দিয়ে করা যায় না। আপনার উদাহরণটি কিছুই প্রমাণ করে না এবং একজন আগতকে বিভ্রান্ত করতে পারে। আপনি মূলত এখানে একটি প্রাইভেট ভেরিয়েবল মোড়ানো করছেন এবং এটি সেট করার আগে এর মানটি প্রদর্শন করুন - অবশ্যই এটি পরিবর্তিত হবে না।
সাইমন_উইভার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.