নকআউটজেএস - একক দৃশ্যে একাধিক ভিউমোডেল


201

আমি ভাবছি যে আমার অ্যাপ্লিকেশনটি এখন বেশ বড় আকারের হয়ে উঠছে, প্রতিটি ভিউকে একটি একক ভিউমোডেল দিয়ে পরিচালনা করতে খুব বড়।

তাই আমি ভাবছি যে একাধিক ভিউমোডেল তৈরি করা এবং সেগুলি একক দৃশ্যে লোড করা কতটা কঠিন। একটি নোট সহ যে আমারও এক্স ভিউমোডেল ডেটা ওয়াই ভিউমোডেল ডেটাতে পাস করতে সক্ষম হওয়া প্রয়োজন যাতে স্বতন্ত্র ভিউমোডেলগুলি একে অপরের সাথে যোগাযোগ করতে সক্ষম হয় বা কমপক্ষে একে অপরের সম্পর্কে সচেতন হতে পারে।

উদাহরণস্বরূপ আমার একটি <select>ড্রপ ডাউন রয়েছে, সেই সিলেক্ট ড্রপ <select>ডাউনের একটি সিলেক্ট স্টেট রয়েছে যা আমাকে নির্বাচিত আইটেমটির আইডি আলাদা আলাদা ভিউমোডেলের অন্য অ্যাজ্যাক্স কলটিতে পাস করতে দেয় ...

একক ভিউতে অসংখ্য ভিউমোডেলগুলি নিয়ে কাজ করার কোনও পয়েন্ট প্রশংসা করেছেন :)


12
এই প্রশ্নে যারা উপস্থিত তাদের জন্য, দয়া করে গৃহীত উত্তরটি স্ক্রোল করুন। নকআউট এখন একাধিক বাইন্ডিং প্রসঙ্গ সমর্থন করে । দৈত্যের দরকার নেই masterVM
ক্যারি কেন্ডাল

উত্তর:


150

যদি তাদের সকলের একই পৃষ্ঠায় থাকা প্রয়োজন হয় তবে এটির একটি সহজ উপায় হ'ল অন্যান্য ভিউ মডেলের একটি অ্যারে (বা সম্পত্তি তালিকা) সহ একটি মাস্টার ভিউ মডেল।

masterVM = {
    vmA : new VmA(),
    vmB : new VmB(),
    vmC : new VmC(),
}

তারপরে আপনার masterVMনিজের প্রয়োজনের জন্য অন্যান্য বৈশিষ্ট্যগুলি পৃষ্ঠাতে থাকতে পারে। এই পরিস্থিতিতে ভিউ মডেলগুলির মধ্যে যোগাযোগ করা কঠিন হবে না কারণ আপনি এর মাধ্যমে রিলে masterVMযেতে পারেন বা আপনি $parent/ $rootইন বাইন্ডিংগুলি ব্যবহার করতে পারেন বা কিছু অন্যান্য কাস্টম বিকল্প ব্যবহার করতে পারেন ।


2
সুতরাং আমি কি এমন কিছু করতে সক্ষম হব: ডেটা-বাইন্ড = "পাঠ্য: মাস্টারভিএম.ভিএমএ", আমি মনে করি আমি এখনও ডিওএম উপাদান সংযুক্ত সহ কো-অ্যাপ্লাইবাইন্ডিংগুলি ব্যবহার করতে পারি। অনুমান করুন এর অর্থ কি আমি করতে পারব: ডেটা-বাইন্ড = "$ প্যারেন্ট.মাস্টারভিএম"?
ক্লায়াউন

12
@ ইউনিয়ন আপনি বাইন্ডিং ব্যবহার করতে পারেন with:, তাই আপনি নিজেকে পুনরাবৃত্তি করবেন না
AlfeG

4
@ ক্লিওন হ্যাঁ, আপনি যদি মাস্টারভিএমের সাথে আবদ্ধ হন তবে আপনি এটি করতে পারেন। আপনি যখন সাব ভিউ মডেলগুলিতে ডুব দেন তখন ডট সিনট্যাক্স এড়ানোর জন্য আপনি "উইথ" বাইন্ডিং ব্যবহার করতে পারেন।
জন পাপা

1
আমি মনে করি এই পদ্ধতিটি একটি অত্যন্ত নিয়ন্ত্রিত একটি ... এখন আমার ক্ষেত্রে আমি এএসপি.নেট এমভিসি 4 ব্যবহার করছি, এটির সাহায্য নেই যেহেতু এর নিজস্ব ভিউমোডেলগুলি এবং আংশিক / বিষয়বস্তু বিভাগগুলি রয়েছে একে অপরের সাথে হস্তক্ষেপ করা উচিত নয় , এবং শর্তাধীন রেন্ডারিংয়ের কারণে এই পদ্ধতির ব্যবহার করা সত্যিই কঠিন হবে difficult
ভুভিন

1
@ ভুভিন <! - কো স্টপবাইন্ডিং: সত্য -> ব্যবহার করে আপনাকে সেই একাধিক ভিউ মডেল এবং আংশিক দর্শন বিভাগে সহায়তা করবে। আরও তথ্যের জন্য knockmeout.net/2012/05/quick-tip-skip-b बाइंडিং html দেখুন ।
মাইকেল ফ্যালিক্স

285

নকআউট এখন একাধিক মডেল বাইন্ডিং সমর্থন করে। দ্যko.applyBindings()উপাদান এবং তার বংশধরদের যা বাঁধাই সক্রিয় করা হবে - পদ্ধতি একটি ঐচ্ছিক প্যারামিটার নেয়।

উদাহরণ স্বরূপ:

ko.applyBindings(myViewModel, document.getElementById('someElementId'))

এটি আইডি someElementIdএবং এর বংশধরদের সাথে উপাদানটির সক্রিয়করণকে সীমাবদ্ধ করে ।

আরও বিশদ জন্য ডকুমেন্টেশন দেখুন ।


72
আপনি যদি কোনও jQuery নির্বাচনকারী ব্যবহার করতে চান, আপনি যেমন [0]একটি আসল DOM উপাদান (jQuery বস্তুর পরিবর্তে) নির্দিষ্ট করতে যুক্ত করতে চান :ko.applyBindings(myViewModel, $('#someElementId')[0])
MrBoJangles

3
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। আপনি বর্তমানে গৃহীত উত্তরের মতো একটি মাস্টার অবজেক্ট ব্যবহার করতে পারেন এবং তারপরে পৃথক ভিউমোডেলগুলিকে পৃষ্ঠার উপযুক্ত উপাদানগুলিতে আবদ্ধ করুন। এটি পারফরম্যান্সে সঞ্চয় করবে এবং ডেটা-বাইন্ডের জন্য প্রয়োজনীয় সুযোগকে সীমাবদ্ধ করবে।
কেভিন হাইড

এই পদ্ধতির সাথে ভিউমোডেলগুলি একে অপরকে যোগাযোগ করা সম্ভব? অর্থাত আমার কাছে টাস্কভিএম এবং নোটভিএম রয়েছে। টাস্কে নোট থাকতে পারে। সুতরাং আমার টাস্কভিএমের অবশ্যই একটি পর্যবেক্ষণযোগ্য অ্যারে থাকতে হবে যেমন নোটগুলির প্রকারটি টাস্কভিএম notes আপনি কি এর মতো কেসের জন্য উদাহরণ ভাগ করতে পারেন?
আহমেট

একটি নতুন প্রশ্নে ভিএমএসের মধ্যে যোগাযোগ সম্পর্কে জিজ্ঞাসা করা ভাল।
রিচার্ড ন্যালিজেনস্কি

21

প্রচুর ভিউমোডেলগুলি একক দর্শন সহ খুব বড় প্রকল্প শেষ করার পরে এটি আমার উত্তর।

এইচটিএমএল ভিউ

    <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
</head>
<body>
    <div id="container1">
        <ul>
            <li >Container1 item</li>
            <!-- ko foreach: myItems -->
            <li>Item <span data-bind="text: $data"></span></li>
            <!-- /ko -->
        </ul>
    </div>

    <div id="container2">
        <ul>
            <li >Container2 item</li>
            <!-- ko foreach: myItems -->
                <li>Item <span data-bind="text: $data"></span></li>
            <!-- /ko -->
        </ul>
    </div>

    <script src="js/jquery-1.11.1.js"></script>
    <script src="js/knockout-3.0.0.js"></script>
    <script src="js/DataFunction.js"></script>
    <script src="js/Container1ViewModel.js"></script>
    <script src="js/Container2ViewModel.js"></script>

</body>
</html>

এই দেখার জন্য আমি দুটি পৃথক জাভাস্ক্রিপ্ট ফাইলগুলিতে আইডি = ধারক 1 এবং আইডি = ধারক 2 এর জন্য 2 টি ভিউ মডেল তৈরি করছি।

Container1ViewModel.js

function Container1ViewModel()
{
    var self = this;
    self.myItems = ko.observableArray();
    self.myItems.push("ABC");
    self.myItems.push("CDE");

} 

Container2ViewModel.js

function Container2ViewModel() {
    var self = this;
    self.myItems = ko.observableArray();
    self.myItems.push("XYZ");
    self.myItems.push("PQR");

}

এর পরে এই 2 ভিউমোডালগুলি ডেটাফানশন.জেজে আলাদা ভিউমোডেল হিসাবে নিবন্ধভুক্ত করছে

var container1VM;
var container2VM;

$(document).ready(function() {

    if ($.isEmptyObject(container1VM)) {
        container1VM = new Container1ViewModel();
        ko.applyBindings(container1VM, document.getElementById("container1"));
    }

    if ($.isEmptyObject(container2VM)) {
        container2VM = new Container2ViewModel();
        ko.applyBindings(container2VM, document.getElementById("container2"));
    }
});

এটির মতো আপনি পৃথক ডিভের জন্য যে কোনও সংখ্যক ভিউ মডেল যুক্ত করতে পারেন। তবে নিশ্চিত হয়ে নিন যে নিবন্ধিত ডিভের ভিতরে কোনও ডিভের জন্য আলাদা ভিউ মডেল তৈরি করবেন না।


ডিওএমের পৃথক উপাদান হওয়ার পরিবর্তে কি অন্য ধরণের ভিউমোডেলটি করা সম্ভব?
ইউজারএস্প

4

নকআউট জেএস-এর জন্য মাল্টিমোডেলস প্লাগইন পরীক্ষা করুন - https://github.com/sergun/Knockout- মাল্টিমোডেলস


6
কেবল কো.এপ্লাইবাইন্ডিংস (ভিউমোডেল, ডকুমেন্ট.সেটমেন্টবিওয়াইআইডি ("ডিভনাম")) এর সাথে এর কী সুবিধা রয়েছে? এটি কি কেবল সিনট্যাকটিক চিনি নয়?
পাওলো দেল মুন্দো

1
@ পাওলো দেল মুন্ডো এটি লাইভকোয়ারি প্লাগইনে একটি নির্ভরতা যুক্ত করেছে।
লার্স গিরুপ ব্রিংক নীলসন

@ পাওলডমুনডো প্লাগইনের উদ্দেশ্য হ'ল সংক্ষিপ্ত উপায়ে ভিউমোডেলগুলির সেট ব্যবহার করতে সক্ষম হবেন
সের্গে জেউজদিন ২

1

আমরা তা অর্জনের জন্য উপাদানগুলি ব্যবহার করি। ( http://knockoutjs.com/docamentation/comp घटक-overview.html )

উদাহরণস্বরূপ, আমাদের তৈরি করা এই উপাদানটি লাইব্রেরি রয়েছে: https://github.com/EDMdesigner/knobjs

আপনি যদি কোডটি খনন করেন তবে আপনি দেখতে পাবেন যে উদাহরণস্বরূপ আমরা নব-বোতামের উপাদানটি বেশ কয়েকটি স্থানে পুনরায় ব্যবহার করি।

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