Ko.utils.unwrapObservable ব্যবহার করবেন কখন?


114

আমি নকআউটজেএস ব্যবহার করে কয়েকটি কাস্টম বাইন্ডিং লিখেছি। আমি কোডটির দিকে তাকানো কখন ব্যবহার করব তা এখনও নিশ্চিত নই ko.utils.unwrapObservable(item), সেই কলটি মূলত itemকোনও পর্যবেক্ষণযোগ্য কিনা তা পরীক্ষা করে । যদি এটি হয় তবে মানটি () যদি না হয় তবে ফিরে দিন। কাস্টম বাইন্ডিং তৈরি সম্পর্কে নকআউটের বিভাগটি দেখে তাদের নীচের বাক্য গঠন রয়েছে:

var value = valueAccessor(), allBindings = allBindingsAccessor();
var valueUnwrapped = ko.utils.unwrapObservable(value);

এই ক্ষেত্রে, তারা পর্যবেক্ষণযোগ্য হয়ে মাধ্যমে ডাকবে ()কিন্তু তারপরেও কল করে ko.utils.unwrapObservable। আমি কখন একটি বনাম অন্যটি ব্যবহার করতে পারি তা নিয়ে একটি হ্যান্ডেল নেওয়ার চেষ্টা করছি বা যদি আমার উপরের প্যাটার্নটি সর্বদা অনুসরণ করা উচিত এবং উভয়ই ব্যবহার করা উচিত।

উত্তর:


142

আপনার ko.utils.unwrapObservableযদি এমন কোনও ক্ষেত্রে ব্যবহার করা উচিত যেখানে আপনি জানেন না যে আপনাকে কোনও পর্যবেক্ষণযোগ্য দেওয়া হয়েছে কি না। এটি সাধারণত একটি কাস্টম বাঁধাইয়ের মধ্যে থাকবে যেখানে পর্যবেক্ষণযোগ্য বা অ-পর্যবেক্ষণযোগ্য এর বিপরীতে আবদ্ধ হতে পারে।

আপনার উপরের valueAccessor()কোডটিতে , কলটি আসলে পর্যবেক্ষণযোগ্য মোড়ক নয়। এটি কেবল সঠিক প্রসঙ্গে বাইন্ডিংয়ে পাস করা মানটি পুনরুদ্ধার করা হচ্ছে (এটি সুরক্ষার জন্য এটি কোনও কার্যে আবৃত হয়ে যায়)। এর রিটার্ন মান valueAccessor()একটি পর্যবেক্ষণযোগ্য বা নাও হতে পারে। এটি বাইন্ডিংয়ে যা যা পাস হয়েছিল তা।


4
এটা সত্যিই পরিস্থিতির উপর নির্ভর করে। কিছু কাস্টম বাইন্ডিংগুলি কেবলমাত্র পর্যবেক্ষণযোগ্যদের সাথে কাজ করার জন্য ডিজাইন করা হয়েছে, যাতে আপনি সামনের দিকে (ko.isObservable) পরীক্ষা করতে পারেন যে এটি একটি পর্যবেক্ষণযোগ্য এবং তারপরে আপনি এটিকে আবদ্ধ করতে মুক্ত হন। যদি আপনি এমন কোনও বস্তু পেয়ে থাকেন যা নিরীক্ষণযোগ্যদের কাছে থাকতে পারে তবে আপনি যদি উইজেট বা তৃতীয় পক্ষের লাইব্রেরিতে প্রবেশের জন্য অবজেক্টের একটি মোড়কানো সংস্করণ পাওয়ার চেষ্টা করছেন তবে আপনি ko.toJS(yourObject)ব্যবহার না করে বরং তার চেয়ে ভাল ko.utils.unwrapObservable। সাধারণভাবে, ko.utils.unwrapObservableপর্যবেক্ষণযোগ্য এবং অ-পর্যবেক্ষণযোগ্যদের সমর্থন করার জন্য এটি ব্যবহার করা সবচেয়ে নিরাপদ ।
আরপি নেইমায়ার

2
আমি অনুমান করি আমি উদ্দেশ্য কী তা নিয়ে বিভ্রান্ত ko.utils.unwrapObservable। কোডটির দিকে তাকিয়ে, এটি কেবল এটি পর্যবেক্ষণযোগ্য কিনা তা পরীক্ষা করে দেখেছে এবং যদি তা হয় তবে নকআউট ()পর্যবেক্ষণযোগ্যটির মান পাওয়ার জন্য অনুরোধ করে, অন্যথায় এটি কেবল পর্যবেক্ষণযোগ্য না হওয়ার জন্য মান দেয়। যদি আমি আগ্রহী সমস্ত হ'ল যদি বাইন্ডিংয়ে প্রবেশ করা ডেটার মান হয় তবে আমি কেন সবসময় ব্যবহার করতে পারি না ()?
আরব

17
আপনি জানেন না যে আপনি কোনও বন্ডিংয়ে পর্যবেক্ষণযোগ্য বা অ-পর্যবেক্ষণযোগ্য পাস করছেন কিনা। বলুন আমার আছে myBindingএবং কেউ বাঁধে যেমন পছন্দ করে data-bind="myBinding: myValue"myValueএকটি পর্যবেক্ষণযোগ্য হতে পারে বা এটি ভিউ মডেলের কেবল একটি সাধারণ সম্পত্তি হতে পারে। যদি এটি কেবল একটি সম্পত্তি এবং আমি এটি কোনও ফাংশনের মতো বলি তবে আপনি একটি ত্রুটি পাবেন। ko.utils.unwrapObservableআপনি পর্যবেক্ষণযোগ্য হয়েছিলেন কিনা তা নির্বিশেষে নিরাপদে আপনাকে মানটি ফিরিয়ে দেবে।
আরপি নেইমায়ার

10
আমি 'কো.উনআরপ' শর্টহ্যান্ড ব্যবহার করারও পরামর্শ দেব কারণ 'কো.ইউটিলস.উনরাপ অবজারভেবল' খুব দীর্ঘ এক্সপ্রেশন।
ইভান নিকিটিন

3
@ ইভাননিকিটিন - অবশ্যই, কেবল এটি উল্লেখ করতে চেয়েছিলেন যে ko.unwrapএটি 3.0+ এ উপলব্ধ। আপনি যদি 3.0 এর চেয়ে বেশি বয়স্ক ব্যবহার করেন তবে ko.utils.unwrapObservableএখনও রয়েছে।
আরপি নেইমায়ার

12

পূর্বের উত্তরটি সঠিক, তবে প্রায়শই আমি কাস্টম বাইন্ডিংগুলিতে ফাংশনগুলিতে পাস করি (এমন একটি ফাংশন যা অনুমতি পরীক্ষা করে, বা অন্য কোনও কিছুর উপর নির্ভর করে কী করা উচিত তা নির্ধারণ করে)। আমার যা প্রয়োজন ছিল তা হ'ল কোনও ফাংশন মোড়ক করা, এমনকি এটি পর্যবেক্ষণযোগ্য না হলেও।

নিম্নলিখিত পুনরাবৃত্তভাবে সমস্ত কিছু আবরণে:

ko.utils.unwrapFunction = function (func) {
    if (typeof func != 'function') {
        return func;
    }
    else {
        return ko.utils.unwrapFunction(func());
    }
};

এখানে আমি লিখেছি এমন একটি সাধারণ কাস্টম বাঁধাইয়ের একটি উদাহরণ:

//replaces single and double 'smart' quotes users commonly paste in from word into textareas and textboxes with normal text equivalents
//USAGE:
//data-bind="replaceWordChars:true
//also works with valueUpdate:'keyup' if you want"

ko.bindingHandlers.replaceWordChars = {
    update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        var bindingValue = ko.utils.unwrapFunction(valueAccessor);

        if (bindingValue) {
            $(element).val(removeMSWordChars(allBindingsAccessor().value())); //update DOM - not sure why I should need to do this, but just updating viewModel doesn't always update DOM correctly for me
            allBindingsAccessor().value($(element).val()); //update viewModel
        }
    }
}

এইভাবে বাইন্ডিংভ্যালুতে সর্বদা একটি মান থাকে। আমি যদি কোনও পর্যবেক্ষণযোগ্য, কোনও পর্যবেক্ষণযোগ্য, মান, বা পর্যবেক্ষণের অভ্যন্তরে এমনকি কোনও ফাংশনে পাস করি তবে আমাকে উদ্বিগ্ন হওয়ার দরকার নেই। এটি যতক্ষণ না আমার পছন্দসই বস্তুটিতে পৌঁছেছে ততক্ষণ এটিকে সবকিছু সঠিকভাবে আনপ্রেপ করা হবে।

আশা করি যে কাউকে সাহায্য করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.