ব্যাকবোন.জেএস-এ কীভাবে আরম্ভকরণ এবং উপস্থাপনাগুলি পরিচালনা করবেন?


199

আমার কাছে ভিউ এবং এর সংক্ষিপ্তসারগুলি আরম্ভ করার এবং রেন্ডার করার জন্য তিনটি ভিন্ন উপায় রয়েছে এবং তাদের প্রত্যেকেরই আলাদা আলাদা সমস্যা রয়েছে। আমি জানতে আগ্রহী যে আরও ভাল কোনও উপায় আছে যা সমস্ত সমস্যার সমাধান করে:


পরিস্থিতি এক:

পিতামাতার প্রাথমিক কার্যের মধ্যে বাচ্চাদের সূচনা করুন। এইভাবে, সবকিছু রেন্ডারে আটকে না যায় যাতে রেন্ডারিংয়ে কম ব্লক হয়।

initialize : function () {

    //parent init stuff

    this.child = new Child();
},

render : function () {

    this.$el.html(this.template());

    this.child.render().appendTo(this.$('.container-placeholder');
}

সমস্যা:

  • সবচেয়ে বড় সমস্যাটি হ'ল দ্বিতীয়বারের জন্য পিতামাতার কাছে রেন্ডার কল করা বাচ্চার ইভেন্টের সমস্ত বাইন্ডিং সরিয়ে ফেলবে। (এই কারণ কিভাবে jQuery এর মধ্যে রয়েছে $.html()কাজ।) এই কল করে নির্বাপিত করা যেতে পারে this.child.delegateEvents().render().appendTo(this.$el);পরিবর্তে, কিন্তু তারপর প্রথম, এবং প্রায়শই ক্ষেত্রে, আপনি অকারণে আরো কাজ করছেন।

  • বাচ্চাদের সংযোজন করার মাধ্যমে, আপনি রেন্ডার ফাংশনটিকে পিতামাতাদের DOM কাঠামো সম্পর্কে জ্ঞান রাখতে বাধ্য করেন যাতে আপনি যে ক্রমটি চান তা পেতে পারেন। যার অর্থ একটি টেমপ্লেট পরিবর্তন করতে কোনও ভিউ রেন্ডার ফাংশন আপডেট করার প্রয়োজন হতে পারে।


পরিস্থিতি দুটি:

শিশুদের পিতামাতার initialize()স্থির স্থানে সূচনা করুন , তবে সংযোজনের পরিবর্তে setElement().delegateEvents()বাচ্চাকে পিতামাতার টেম্পলেটে একটি উপাদান হিসাবে সেট করতে ব্যবহার করুন ।

initialize : function () {

    //parent init stuff

    this.child = new Child();
},

render : function () {

    this.$el.html(this.template());

    this.child.setElement(this.$('.placeholder-element')).delegateEvents().render();
}

সমস্যা:

  • এটি delegateEvents()এখন প্রয়োজনীয় করে তোলে যা এটি প্রথম দৃশ্যে পরবর্তী কলগুলিতে কেবল প্রয়োজনীয় হওয়ার জন্য কিছুটা নেতিবাচক।

পরিস্থিতি তিনটি:

render()পরিবর্তে পিতামাতার পদ্ধতিতে শিশুদের সূচনা করুন ।

initialize : function () {

    //parent init stuff
},

render : function () {

    this.$el.html(this.template());

    this.child = new Child();

    this.child.appendTo($.('.container-placeholder').render();
}

সমস্যা:

  • এর অর্থ হ'ল রেন্ডার ফাংশনটি এখন আরম্ভের সমস্ত যুক্তির সাথেও আবদ্ধ থাকতে হবে।

  • যদি আমি সন্তানের দর্শনগুলির মধ্যে একটির অবস্থার সম্পাদনা করি এবং তারপরে পিতামাতার কাছে রেন্ডার কল করি তবে একটি সম্পূর্ণ নতুন শিশু তৈরি করা হবে এবং এর বর্তমান অবস্থাটি সমস্ত হারিয়ে যাবে। যা মনে হয় এটি মেমরি ফাঁস জন্য dicey পেতে পারে।


আপনার ছেলেদের এটি গ্রহণ করতে সত্যই আগ্রহী। আপনি কোন দৃশ্যের ব্যবহার করবেন? বা চতুর্থ যাদু কি এই সমস্ত সমস্যার সমাধান করে?

আপনি কি কখনও কোনও দৃশ্যের জন্য উপস্থাপিত রাজ্যের সন্ধান করেছেন? একটি renderedBeforeপতাকা বলুন ? সত্যিই জানকি মনে হচ্ছে।


1
আমি সাধারণত পিতামাতাদের মতামতগুলিতে শিশু দৃষ্টিভঙ্গির রেফারেন্সগুলিকে ছড়িয়ে দিচ্ছি না কারণ বেশিরভাগ যোগাযোগ মডেল / সংগ্রহ এবং এর পরিবর্তনের মাধ্যমে ঘটানো ইভেন্টগুলির মাধ্যমে ঘটে। তৃতীয় ক্ষেত্রে যদিও আমি বেশিরভাগ সময় ব্যবহার করি তার নিকটতম। কেস 1 যেখানে এটি উপলব্ধি করে। এছাড়াও বেশিরভাগ সময় আপনার পুরো দর্শনটি পুনরায় রেন্ডারিং করা উচিত নয় বরং সেই অংশটি পরিবর্তিত হয়েছে
টম টু

অবশ্যই, আমি স্পষ্টতই কেবল পরিবর্তিত অংশগুলি রেন্ডার করতে পারি, তবে তারপরেও আমি মনে করি রেন্ডার ফাংশনটি যেভাবেই পাওয়া উচিত এবং অ-ধ্বংসাত্মক tive পিতামাতার মধ্যে বাচ্চাদের একটি উল্লেখ না থাকার আপনি কীভাবে পরিচালনা করবেন?
ইয়ান স্টর্ম টেলর

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

1
উচ্চ-স্তরের সম্পর্কিত সম্পর্কিত আলোচনার জন্য দেখুন: স্ট্যাকওভারফ্লো . com / প্রশ্নগুলি / 10077185/…
বেন রবার্টস

2
পরিস্থিতি দু'এ, কেন এটির delegateEvents()পরে ফোন করা প্রয়োজন setElement()? দস্তাবেজ অনুসারে: "... এবং ভিউটির পূর্বনির্ধারিত ইভেন্টগুলি পুরানো উপাদান থেকে নতুনে স্থানান্তরিত করুন", setElementপদ্ধতিটি নিজেই ইভেন্টগুলির পুনরায় প্রতিনিধি দলের পরিচালনা করবে।
rdamborsky

উত্তর:


260

এটা একটা ভাল প্রশ্ন. ব্যাকবোনটি দুর্দান্ত অনুমানের অভাবের কারণে দুর্দান্ত, তবে এর অর্থ এই নয় যে আপনাকে নিজের মতো জিনিসগুলি কীভাবে প্রয়োগ করতে হবে (কীভাবে সিদ্ধান্ত নেবেন)। আমার নিজের জিনিসগুলি দেখার পরে, আমি দেখতে পাচ্ছি যে আমি (ধরণের) দৃশ্যের 1 এবং দৃশ্য 2 এর মিশ্রণটি ব্যবহার করি I আমি মনে করি না যে চতুর্থ magন্দ্রজালিক দৃশ্য বিদ্যমান কারণ কেবলমাত্র 1 এবং 2 দৃশ্যে আপনি যা কিছু করেন তা অবশ্যই হতে পারে সম্পন্ন.

আমি মনে করি এটি উদাহরণ সহ আমি কীভাবে পরিচালনা করতে চাই তা ব্যাখ্যা করা সবচেয়ে সহজ হবে। বলুন যে আমি এই সাধারণ পৃষ্ঠাটি নির্দিষ্ট দর্শনগুলিতে বিভক্ত করেছি:

পৃষ্ঠা ভাঙ্গন

বলুন এইচটিএমএল, রেন্ডার হওয়ার পরে, এরকম কিছু:

<div id="parent">
    <div id="name">Person: Kevin Peel</div>
    <div id="info">
        First name: <span class="first_name">Kevin</span><br />
        Last name: <span class="last_name">Peel</span><br />
    </div>
    <div>Phone Numbers:</div>
    <div id="phone_numbers">
        <div>#1: 123-456-7890</div>
        <div>#2: 456-789-0123</div>
    </div>
</div>

এইচটিএমএলটি চিত্রের সাথে কীভাবে মেলে তা আশাবাদী pretty

ParentView2 সন্তান মতামত, ঝুলিতে InfoViewএবং PhoneListViewসেইসাথে কিছু অতিরিক্ত আছে divs, যা এক, #name, কিছু সময়ে নির্ধারণ করা প্রয়োজন। PhoneListViewশিশুদের নিজস্ব মতামত, PhoneViewএন্ট্রিগুলির একটি অ্যারে রাখে ।

আপনার আসল প্রশ্ন তাই। আমি ভিউ টাইপের ভিত্তিতে ইনিশিয়েশন এবং রেন্ডারিং হ্যান্ডেল করি। আমি আমার দৃষ্টিভঙ্গি দুটি ধরণের, Parentভিউ এবং Childদর্শনগুলিতে বিভক্ত করি ।

তাদের মধ্যে পার্থক্যটি সহজ, Parentদর্শনগুলি সন্তানের ধারণাগুলি ধারণ করে এবং Childদেখায় না। তাই আমার উদাহরণে, ParentViewএবং PhoneListViewহয় Parent, ভিউ যখন InfoViewএবং PhoneViewএন্ট্রি Childমতামত।

আমি আগে যেমন উল্লেখ করেছি, এই দুটি বিভাগের মধ্যে সবচেয়ে বড় পার্থক্য হ'ল যখন তাদের রেন্ডার করার অনুমতি দেওয়া হয়। একটি নিখুঁত বিশ্বে আমি Parentএকবারে একবারে রেন্ডার করতে চাই views মডেল (গুলি) পরিবর্তিত হলে যে কোনও পুনরায় রেন্ডারিং পরিচালনা করতে তাদের সন্তানের ধারণার উপর নির্ভর করে। Childমতামত, অন্যদিকে, আমি যে কোনও সময় তাদের প্রয়োজন অনুসারে পুনরায় রেন্ডার করার অনুমতি দিচ্ছি কারণ তাদের উপর নির্ভর করে অন্য কোনও মতামত নেই।

আরও কিছুটা বিশদে, Parentদর্শনের জন্য আমি আমার initializeকাজগুলি কয়েকটি জিনিস করতে পছন্দ করি :

  1. আমার নিজের মতামত শুরু করুন
  2. আমার নিজের মতামত রেন্ডার করুন
  3. যেকোন সন্তানের মতামত তৈরি এবং আরম্ভ করুন।
  4. প্রতিটি সন্তানের আমার ভিউয়ের মধ্যে একটি উপাদান দেখার জন্য বরাদ্দ করুন (যেমন InfoViewবরাদ্দ করা হবে #info)।

পদক্ষেপ 1 বেশ স্ব স্ব বর্ণনামূলক।

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

3 বা 4 পদক্ষেপগুলি আসলে elশিশু দৃষ্টিভঙ্গি তৈরি করার সময় আমি যেভাবে পাস করি ঠিক একই সময়ে পরিচালনা করা হয় । আমি এখানে একটি উপাদানটি পাস করতে চাই বলে আমার মনে হয় যে পিতামাতার উচিত নির্ধারণ করা উচিত যেখানে তার নিজের দৃষ্টিভঙ্গিতে সন্তানের বিষয়বস্তু রাখার অনুমতি রয়েছে।

রেন্ডারিংয়ের জন্য, আমি দেখার জন্য এটি খুব সহজ রাখার চেষ্টা করি Parent। আমি চাই renderফাংশনটি প্যারেন্ট ভিউ রেন্ডার করা ছাড়া আর কিছু না করে। কোনও ইভেন্ট প্রতিনিধি, শিশু দৃষ্টিভঙ্গির কোনও রেন্ডারিং, কিছুই নয়। শুধু একটি সহজ রেন্ডার।

কখনও কখনও এটি যদিও সবসময় কাজ করে না। উদাহরণস্বরূপ, আমার উপরের উদাহরণে উদাহরণস্বরূপ, #nameমডেলটির মধ্যে যে কোনও সময় নাম পরিবর্তন হওয়ার সাথে সাথে উপাদানটি আপডেট করতে হবে। যাইহোক, এই ব্লকটি ParentViewটেম্পলেটটির একটি অংশ এবং একটি উত্সর্গীকৃত Childদর্শন দ্বারা পরিচালিত নয় , তাই আমি এটিকে ঘিরে কাজ করি। আমি এমন একধরণের subRenderফাংশন তৈরি করব যা কেবলমাত্র#name উপাদানটির বিষয়বস্তু প্রতিস্থাপন করে এবং পুরো #parentউপাদানটি ট্র্যাশ করতে হবে না । এটি হ্যাকের মতো মনে হতে পারে তবে পুরো ডিওএমকে পুনরায় রেন্ডারিং এবং উপাদান এবং এ জাতীয় উপাদানগুলির পুনরায় সরবরাহ করার বিষয়ে চিন্তা করার চেয়ে আমি সত্যিই এটি আরও ভাল কাজ করেছি। আমি যদি সত্যিই এটি পরিষ্কার করতে চাই, তবে আমি একটি নতুন Childভিউ তৈরি করব (অনুরূপ InfoView) যা #nameব্লকটি পরিচালনা করবে ।

এখন Childদেখার জন্য , কেবলমাত্র আরও কোনও মতামত তৈরি না করেই দেখার মতামতগুলির initializationমত একইরকম । তাই:ParentChild

  1. আমার দৃশ্যের সূচনা করুন
  2. আমি যে মডেলটির বিষয়ে যত্নশীল সেটিকে সেটআপ বাঁধে
  3. আমার মতামত রেন্ডার

Childভিউ রেন্ডারিং খুব সহজ, শুধু আমার লিখিত সামগ্রী রেন্ডার এবং সেট করে el। আবার, প্রতিনিধি বা এর মতো কোনও কিছুর সাথে গোলযোগ নেই।

আমার ParentViewদেখতে কেমন লাগে তার উদাহরণ কোড এখানে দেওয়া হয়েছে :

var ParentView = Backbone.View.extend({
    el: "#parent",
    initialize: function() {
        // Step 1, (init) I want to know anytime the name changes
        this.model.bind("change:first_name", this.subRender, this);
        this.model.bind("change:last_name", this.subRender, this);

        // Step 2, render my own view
        this.render();

        // Step 3/4, create the children and assign elements
        this.infoView = new InfoView({el: "#info", model: this.model});
        this.phoneListView = new PhoneListView({el: "#phone_numbers", model: this.model});
    },
    render: function() {
        // Render my template
        this.$el.html(this.template());

        // Render the name
        this.subRender();
    },
    subRender: function() {
        // Set our name block and only our name block
        $("#name").html("Person: " + this.model.first_name + " " + this.model.last_name);
    }
});

আপনি আমার বাস্তবায়ন subRenderএখানে দেখতে পারেন । subRenderপরিবর্তে আবদ্ধ পরিবর্তন করে render, আমাকে পুরো ব্লকটি বিস্ফোরণ এবং পুনর্নির্মাণ সম্পর্কে চিন্তা করতে হবে না।

InfoViewব্লকের উদাহরণ কোড এখানে :

var InfoView = Backbone.View.extend({
    initialize: function() {
        // I want to re-render on changes
        this.model.bind("change", this.render, this);

        // Render
        this.render();
    },
    render: function() {
        // Just render my template
        this.$el.html(this.template());
    }
});

বাইন্ডগুলি এখানে গুরুত্বপূর্ণ অংশ। আমার মডেলটির সাথে আবদ্ধ হয়ে আমাকে renderনিজেকে নিজে কল করা নিয়ে কখনই চিন্তা করতে হবে না । যদি মডেলটি পরিবর্তন হয় তবে এই ব্লকটি অন্য কোনও দর্শন প্রভাবিত না করে নিজেই পুনরায় রেন্ডার করবে।

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

PhoneViewপ্রায় অভিন্ন হতে হবে InfoView, শুধুমাত্র মডেল পরিবর্তন আনা হয়েছে তা বজায় রাখে শোনা।

আশা করি এটি কিছুটা সহায়তা করেছে, দয়া করে কোনও কিছু বিভ্রান্ত করছে কিনা বা যথেষ্ট বিশদ বিবরণ না থাকলে দয়া করে আমাকে জানান।


8
সত্যিই পুরো ব্যাখ্যা ধন্যবাদ। প্রশ্ন যদিও, আমি শুনেছি এবং সম্মত হয়েছি যে পদ্ধতির renderভিতরে কল initializeকরা একটি খারাপ অভ্যাস, কারণ আপনি যদি এখনই রেন্ডার করতে চান না এমন ক্ষেত্রে এটি আপনাকে আরও পারফরম্যান্স হতে বাধা দেয়। আপনি এ ব্যপারে কী ভাবছেন?
ইয়ান স্টর্ম টেলর

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

5
প্যারেন্টভিউ পুনরায় রেন্ডার করতে সক্ষম না হওয়াই বড় সীমাবদ্ধতা। আমার এমন পরিস্থিতি আছে যেখানে আমার মূলত একটি ট্যাব নিয়ন্ত্রণ থাকে, যেখানে প্রতিটি ট্যাব আলাদা আলাদা প্যারেন্টভিউ দেখায়। দ্বিতীয়বার যখন কোনও ট্যাব ক্লিক করা হয় তখন আমি বিদ্যমান প্যারেন্টভিউকে কেবল পুনরায় রেন্ডার করতে চাই, তবে এটি করার ফলে চাইল্ডভিউগুলিতে ইভেন্টগুলি হারিয়ে যাওয়ার কারণ হয় (আমি শিশুদের তৈরি করি এবং তাদের রেন্ডারে রেন্ডার করি)। আমি অনুমান করি যে আমি 1) রেন্ডারের পরিবর্তে লুকান / প্রদর্শন করি, 2) চাইল্ডভিউ'র রেন্ডারে ডেলিগ্রেট এজেন্টস, বা 3) শিশুদের রেন্ডারে তৈরি করুন, বা 4) পারফেক্ট সম্পর্কে চিন্তা করবেন না। এটি কোনও সমস্যা হওয়ার আগে এবং প্রতিবার প্যারেন্টভিউ পুনরায় তৈরি করুন। Hmmmm ....
পল Hoenecke

আমার উচিত এটি আমার ক্ষেত্রে সীমাবদ্ধতা। আপনি যদি পিতামাতাকে পুনরায় রেন্ডার করার চেষ্টা না করেন তবে এই সমাধানটি কার্যকর হবে :) আমার কাছে ভাল উত্তর নেই তবে আমার কাছে ওপি-র মতো একই প্রশ্ন রয়েছে। তবুও আশা করছি সঠিক 'ব্যাকবোন' পথের সন্ধান করুন। এই মুহুর্তে, আমি আড়াল / শো করার কথা ভাবছি এবং পুনরায় রেন্ডার না করা আমার পক্ষে যাওয়ার উপায়।
পল হোয়েনকে

1
আপনি কিভাবে সন্তানের মধ্যে সংগ্রহ পাস PhoneListView?
ত্রি এনগুইন

6

আমি নিশ্চিত নই যে এটি সরাসরি আপনার প্রশ্নের উত্তর দেয় কিনা তবে আমি মনে করি এটি প্রাসঙ্গিক:

http://lostechies.com/derickbailey/2011/10/11/backbone-js-getting-the-model-for-a-clicked-element/

আমি এই নিবন্ধটি যে প্রসঙ্গে স্থাপন করেছি তা অবশ্যই আলাদা, তবে আমি মনে করি যে দুটি প্রস্তাব আমি উত্পন্ন করি তার পাশাপাশি প্রতিটিটির পক্ষে মতামতও আপনাকে সঠিক পথে নিয়ে যাওয়া উচিত।


6

আমার কাছে মনে হয় না যে এটি কোনও ধরণের পতাকার মাধ্যমে অন্তর্নিহিত সেটআপ এবং পরবর্তী দর্শনের আপনার সেটআপগুলির মধ্যে পার্থক্য করা খারাপ ধারণা idea এটিকে পরিষ্কার এবং সহজ করার জন্য পতাকাটি আপনার নিজস্ব নিজস্ব ভিউতে যুক্ত করা উচিত যা ব্যাকবোন (বেস) ভিউটি প্রসারিত করবে।

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

আরও দেখুন: ব্যাকবোনটিতে ইভেন্টবেস ব্যবহার


3

কেভিন পিল একটি দুর্দান্ত উত্তর দেয় - এখানে আমার টিএল; ডাঃ সংস্করণ:

initialize : function () {

    //parent init stuff

    this.render(); //ANSWER: RENDER THE PARENT BEFORE INITIALIZING THE CHILD!!

    this.child = new Child();
},

2

আমি এই মত মতামত মধ্যে সংযোগ এড়াতে চেষ্টা করছি। আমি সাধারণত দুটি উপায় করি:

একটি রাউটার ব্যবহার করুন

মূলত, আপনি আপনার রাউটার ফাংশনটি পিতামাতা ও শিশু দর্শনকে আরম্ভ করতে দিন। সুতরাং ভিউ একে অপরের জ্ঞান নেই, তবে রাউটারটি সব পরিচালনা করে।

উভয় মতামতে একই এল পাস করা

this.parent = new Parent({el: $('.container-placeholder')});
this.child = new Child({el: $('.container-placeholder')});

উভয়েরই একই ডোম সম্পর্কে জ্ঞান রয়েছে এবং আপনি যেভাবেই চান সেগুলি অর্ডার করতে পারেন।


2

আমি যা করি তা প্রতিটি বাচ্চাকে একটি পরিচয় দিচ্ছে (যা ব্যাকবোন ইতিমধ্যে আপনার জন্য করেছে: সিড)

যখন কনটেইনার রেন্ডারিং করে, 'সিডি' এবং 'ট্যাগনাম' ব্যবহার করে প্রতিটি শিশুর জন্য একটি স্থানধারক তৈরি করে, সুতরাং টেমপ্লেটে কনটেইনারটি কোথায় রাখবে সে সম্পর্কে শিশুদের কোনও ধারণা নেই।

<tagName id='cid'></tagName>

আপনি ব্যবহার করতে পারেন তুলনায়

Container.render()
Child.render();
this.$('#'+cid).replaceWith(child.$el);
// the rapalceWith in jquery will detach the element 
// from the dom first, so we need re-delegateEvents here
child.delegateEvents();

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


1

সাবউভিউগুলি তৈরি ও উপস্থাপনের জন্য এখানে একটি হালকা ওজনের মিক্সিন রয়েছে, যা আমি মনে করি যে এই থ্রেডের সমস্ত সমস্যার সমাধান করে:

https://github.com/rotundasoftware/backbone.subviews

এই প্লাগটি গ্রহণের পদ্ধতিটি প্যারেন্ট ভিউটি প্রথমবার উপস্থাপনের পরে সাবভিউগুলি তৈরি এবং রেন্ডার করে। তারপরে, প্যারেন্ট ভিউয়ের পরবর্তী রেন্ডারগুলিতে, the সাবউভিউ উপাদানগুলি সুনির্দিষ্ট করুন, পিতামাতাকে পুনরায় রেন্ডার করুন, তারপরে উপযুক্ত জায়গায় সাবউভিউ উপাদানগুলি সন্নিবেশ করুন এবং পুনরায় রেন্ডার করুন। এইভাবে সাবউভিউজ অবজেক্টগুলি পরবর্তী রেন্ডারগুলিতে পুনরায় ব্যবহার করা হয়, এবং ইভেন্টগুলি পুনরায় প্রতিনিধি প্রেরণের দরকার হয় না।

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

সম্পাদনা: সংগ্রহ ভিউ মামলার জন্য, আপনি ক্লিকগুলি এবং / অথবা পুনরায় অর্ডারিংয়ের জন্য টেনে আনার এবং ছাড়ার উপর ভিত্তি করে মডেলগুলির নির্বাচন প্রয়োজন হলে এই আরও ইউআই ফোকাস বাস্তবায়নও দেখতে চাইতে পারেন।

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