ব্যাকবোন.জেএস দিয়ে বিপরীত সাজানোর ক্রম


90

সঙ্গে Backbone.js আমি করেছি সংগ্রহে একটি comparator ফাংশন সেট আপ পেয়েছিলাম। এটি দুর্দান্তভাবে মডেলগুলি বাছাই করছে তবে আমি ক্রমটি বিপরীত করতে চাই।

আমি কীভাবে মডেলগুলিকে আরোহণের পরিবর্তে অবতরণ ক্রমে সাজিয়ে রাখতে পারি?


4
স্ট্রিংগুলিতে বিপরীত বাছাইয়ের জন্য (তৈরি করা ক্ষেত্রগুলি সহ) আরও একটি প্রশ্নের এই উত্তরটি দেখুন
এরিক হু

4
২০১২ সালের শুরু থেকে বাছাই-শৈলীর তুলনাকারীদের জন্য সমর্থন রয়েছে Just কেবল 2 টি যুক্তি গ্রহণ করুন এবং -1, 0 বা 1 প্রত্যাবর্তন করুন
জিওন

এটিই আমার জন্য কাজ করেছে (স্ট্রিংস এবং নাম্বারগুলি): স্ট্যাকওভারফ্লো.com
জিজ্ঞাসা

উত্তর:


133

ঠিক আছে, আপনি তুলনামূলক থেকে নেতিবাচক মান ফিরে আসতে পারেন। উদাহরণস্বরূপ, যদি আমরা ব্যাকবোন এর সাইট থেকে নেওয়া উদাহরণটি গ্রহণ করি এবং ক্রমটি বিপরীত করতে চাই তবে এটি দেখতে এরকম হবে:

var Chapter  = Backbone.Model;
var chapters = new Backbone.Collection;

chapters.comparator = function(chapter) {
  return -chapter.get("page"); // Note the minus!
};

chapters.add(new Chapter({page: 9, title: "The End"}));
chapters.add(new Chapter({page: 5, title: "The Middle"}));
chapters.add(new Chapter({page: 1, title: "The Beginning"}));

alert(chapters.pluck('title'));

4
আমার হিসাবে একই উদাহরণ কোড ব্যবহারের জন্য হাই 5, এবং 15 সেকেন্ডের মধ্যে পার্থক্য। মনের মত আমার বলতে হবে।
ধ্রুবপাঠক

ওহ, অবশ্যই, একটি বিয়োগ চিহ্ন। আপনার দ্রুত প্রতিক্রিয়া জন্য উভয় ধন্যবাদ!
ড্র দারা-আব্রামস

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

9
২০১২ সালের শুরু থেকে বাছাই-শৈলীর তুলনাকারীদের জন্য সমর্থন রয়েছে Just মাত্র 2 টি যুক্তি স্বীকার করুন এবং 1-0
জিওন

@Fasani প্রতিক্রিয়া সংখ্যার চেয়ে অন্যান্য ধরনের জন্য কাজ করে, দয়া করে দেখেছ: stackoverflow.com/questions/5013819/...
JayC

56

ব্যক্তিগতভাবে, আমি এখানে প্রদত্ত যে কোনও সমাধান নিয়ে খুশি নই:

  • -1 সমাধান দ্বারা গুণমান যখন সকারের ধরণটি সংখ্যাযুক্ত হয় তখন কাজ করতে ব্যর্থ হয়। যদিও এর চারপাশে উপায় রয়েছে ( Date.getTime()উদাহরণস্বরূপ ফোন করে) এই মামলাগুলি সুনির্দিষ্ট। ক্ষেত্রের নির্দিষ্ট ধরণের বাছাইয়ের বিষয়ে উদ্বিগ্ন না হয়ে যে কোনও ধরণের দিকনির্দেশকে বিপরীত করার আমি একটি সাধারণ উপায় চাই।

  • স্ট্রিং সলিউশনটির জন্য, একবারে একটি স্ট্রিংয়ের একটি অক্ষর তৈরি করা একটি পারফরম্যান্স বাধা হিসাবে মনে হয়, বিশেষত বড় সংগ্রহগুলি ব্যবহার করার সময় (বা প্রকৃতপক্ষে বৃহত্তর সাজানোর ক্ষেত্রের স্ট্রিংগুলি)

স্ট্রিং, তারিখ এবং সংখ্যাসূচক ক্ষেত্রগুলির জন্য দুর্দান্তভাবে কাজ করে এমন একটি সমাধান এখানে দেওয়া হয়েছে:

প্রথমত, এমন একটি তুলনামূলক ঘোষণা করুন যা এই জাতীয় পছন্দ অনুসারে বাছাইয়ের মাধ্যমে ফাংশনটির ফলাফলকে বিপরীত করবে:

function reverseSortBy(sortByFunction) {
  return function(left, right) {
    var l = sortByFunction(left);
    var r = sortByFunction(right);

    if (l === void 0) return -1;
    if (r === void 0) return 1;

    return l < r ? 1 : l > r ? -1 : 0;
  };
}

এখন, আপনি যদি বাছাইয়ের দিকটি উল্টাতে চান তবে আমাদের যা করতে হবে তা হ'ল:

var Chapter  = Backbone.Model;
var chapters = new Backbone.Collection;

// Your normal sortBy function
chapters.comparator = function(chapter) {
  return chapter.get("title"); 
};


// If you want to reverse the direction of the sort, apply 
// the reverseSortBy function.
// Assuming the reverse flag is kept in a boolean var called reverseDirection 
if(reverseDirection) {
   chapters.comparator = reverseSortBy(chapters.comparator);
}

chapters.add(new Chapter({page: 9, title: "The End"}));
chapters.add(new Chapter({page: 5, title: "The Middle"}));
chapters.add(new Chapter({page: 1, title: "The Beginning"}));

alert(chapters.pluck('title'));

এই কাজ করার কারণটি হ'ল Backbone.Collection.sortযদি বাছাই ফাংশনে দুটি যুক্তি থাকে তবে ভিন্নভাবে আচরণ করে। এই ক্ষেত্রে, এটি একইভাবে আচরণ করে যেমনটি তুলনাকারী .ুকে পড়ে Array.sort। এই সমাধানটি দুটি যুক্তি তুলকের তুলনায় একক যুক্তি সাজানোর মাধ্যমে ফাংশনটিকে অভিযোজিত করে এবং ফলাফলটি উল্টিয়ে কাজ করে।


7
এই প্রশ্নের সর্বাধিক উত্সাহিত উত্তর ব্যক্তি হিসাবে, আমি সত্যিই এই পদ্ধতির পছন্দ করি এবং মনে করি এটির আরও উন্নতি হওয়া উচিত।
অ্যান্ড্রু ডি অ্যান্ড্রেড

আপনাকে অনেক ধন্যবাদ অ্যান্ড্রু
অ্যান্ড্রু নিউডিগেট

খুব সুন্দর, আমি এটিকে কিছুটা টুইট করে ব্যাকবোন.ক্লেশনের প্রোটোটাইপ এ বিমূর্ত করে শেষ করেছি। একটি গুচ্ছ ধন্যবাদ!
কেনড্রিক লেডেট

46

ব্যাকবোন.জেএস-এর সংগ্রহের তুলনা করা বোঝা যায় বোঝা-বোঝা.জেএস পদ্ধতি _.সোর্টবাইয়ের মাধ্যমে। সাজ্টবাইয়ের প্রয়োগটি জাভাস্ক্রিপ্টকে "মোড়ানো" শেষ করে s স্ট্রিংয়ের সরল অবহেলা এনএএন ফিরে আসা শেষ করে এবং বাছাই করে।

আপনার যদি স্ট্রিংগুলির সাথে বিপরীত বর্ণানুক্রমিক সাজানোর মতো বিপরীত বাছাই করতে হয় তবে এটি করার একটি সত্যই হ্যাকিশ উপায় এখানে রয়েছে:

comparator: function (Model) {
  var str = Model.get("name");
  str = str.toLowerCase();
  str = str.split("");
  str = _.map(str, function(letter) { 
    return String.fromCharCode(-(letter.charCodeAt(0)));
  });
  return str;
}

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


এটি খুব সহজ। ধন্যবাদ অ্যান্ড্রু!
হাবিল

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

4
@ অ্যান্ড্রুড্রেঅ্যান্ড্রেড কেন: আমি প্রথমে সর্বাধিক নতুনকে পরিবেশন করে 'তৈরি_ট' বৈশিষ্ট্য অনুসারে একটি সংগ্রহকে বাছাই করতে চাই। এই বৈশিষ্ট্যটি ব্যাকবোনটির অন্যতম ডিফল্ট এবং স্ট্রিং হিসাবে সংরক্ষণ করা হয়। আপনার উত্তরটি আমি যা চাই তার নিকটে আসে। ধন্যবাদ!
এরিক হু

এটি আশ্চর্যজনক, গত এক ঘন্টা ধরে এটির সমাধানে কাজ করে যাচ্ছেন।

29

আমার সমাধানটি ছিল সাজানোর পরে ফলাফলগুলি বিপরীত করা।

প্রথমে নীরবতার সাথে ডাবল রেন্ডারিং রোধ করতে, তারপরে 'রিসেট' ট্রিগার করুন।

collections.sort({silent:true})
collections.models = collections.models.reverse();
collections.trigger('reset', collections, {});

4
তুলনাকারীর ফলাফলকে অগ্রাহ্য করা একটি আরও ভাল সমাধান।
ড্যানিয়েল এক্স মুর

7
ড্যানিয়েল, স্ট্রিং বা তারিখগুলি বাছাই করার সময় এটি সর্বদা সম্ভব নয়।
গ্যাভিন শুল্জ

4
এটা নিশ্চিত. তারিখের জন্য আপনি তুলনামূলক ফিরে আসতে পারেন -Date.getTime(), সম্ভবত যদি আপনি বিশ্বাস করেন যে আপনার সিস্টেমে তারিখগুলি ইউনিক্স সময়কে অতিক্রম করবে। বর্ণানুক্রমিক জন্য, উপরে অ্যান্ড্রু এর উত্তর দেখুন।
asparagino

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

13

আপনি বর্তমানে যে ডেটা করছেন তা ফিরিয়ে দেওয়ার পরিবর্তে কিছু বিপরীতমুখী প্রাকৃতিক মান ফেরানোর জন্য আপনার তুলনামূলক ফাংশনটি সংশোধন করুন। কিছু কোড থেকে: http://docamentcloud.github.com/backbone/# Colલેક્-- সংস্থাপক

উদাহরণ:

var Chapter  = Backbone.Model;
var chapters = new Backbone.Collection;

/* Method 1: This sorts by page number */
chapters.comparator = function(chapter) {
  return chapter.get("page");
};

/* Method 2: This sorts by page number in reverse */
chapters.comparator = function(chapter) {
  return -chapter.get("page");
};

chapters.add(new Chapter({page: 9, title: "The End"}));
chapters.add(new Chapter({page: 5, title: "The Middle"}));
chapters.add(new Chapter({page: 1, title: "The Beginning"}));

9

নিম্নলিখিতটি আমার পক্ষে ভাল কাজ করেছে:

comparator: function(a, b) {
  // Optional call if you want case insensitive
  name1 = a.get('name').toLowerCase();
  name2 = b.get('name').toLowerCase();

  if name1 < name2
    ret = -1;
  else if name1 > name2
    ret = 1;
  else
    ret = 0;

  if this.sort_dir === "desc"
    ret = -ret
  return ret;
}

collection.sort_dir = "asc";
collection.sort(); // returns collection in ascending order
collection.sort_dir = "desc";
collection.sort(); // returns collection in descending order

8

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

অ্যারে.প্রোটোটাইপ.সোর্ট () সম্পর্কিত তথ্য এখানে পাওয়া যাবে: https://developer.mozilla.org/en-US/docs/Web/JavaScript/References/Global_Objects/Array/sort?redirectlocale=en-US&redirectslug=JavaScript% 2F রেফারেন্স% 2F গ্লোবাল_অবজেক্টস% 2 এফরায়ে% 2 এফসোর্ট

এই প্রশ্নের অনেক উত্তর পৃষ্ঠায় ফেরত দেওয়ার ঠিক আগে অর্ডারটিকে বিপরীত করে দেয়। এটি আদর্শ নয়।

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

//Assuming this or similar will be in your Backbone.Collection.
sortKey: 'id', //The field name of the item in your collection

reverseSortDirection: false,

comparator: function(a, b) {

  var sampleDataA = a.get(this.sortKey),
      sampleDataB = b.get(this.sortKey);

      if (this.reverseSortDirection) {
        if (sampleDataA > sampleDataB) { return -1; }
        if (sampleDataB > sampleDataA) { return 1; }
        return 0;
      } else {
        if (sampleDataA < sampleDataB) { return -1; }
        if (sampleDataB < sampleDataA) { return 1; }
        return 0;
      }

},

সংকলন বা মডেল পরিবর্তনের ক্ষেত্রে দুটি মডেল বাদে তুলনাকারী কম্পাটার ফাংশনটি সঞ্চালিত হয় এবং সংগ্রহের ক্রম পরিবর্তন করে।

আমি সংখ্যা এবং স্ট্রিংয়ের সাথে এই পদ্ধতির পরীক্ষা করেছি এবং এটি আমার জন্য নিখুঁতভাবে কাজ করছে বলে মনে হচ্ছে।

আমি সত্যিই আশা করি যে এই উত্তরটি বেশিরভাগ ক্ষেত্রে এই সমস্যার সাথে লড়াই করেছি এবং প্রায়শই একটি কাজ ব্যবহার করে শেষ করতে সহায়তা করতে পারে।


4
আমি ভালো কারণ যুক্তিবিজ্ঞান সংগ্রহে মধ্যে বসবাস, কিন্তু আপনি খুব সহজেই নির্ধারণ করতে পারেন sortKeyএবং reverseSortDirectionএবং কল .sort()সংগ্রহের একটি হ্যান্ডল যে কোনো ভিউ থেকে। আমার কাছে অন্যান্য উচ্চ-ভোট দেওয়া উত্তরের চেয়ে সহজ।
নোহ হেলডম্যান

5

এই সাজানোর পদ্ধতিতে ওভাররাইড করে মার্জিতভাবে করা যায়। এখানে একটি উদাহরণ

var SortedCollection = Backbone.Collection.extend({

   initialize: function () {
       // Default sort field and direction
       this.sortField = "name";
       this.sortDirection = "ASC";
   },

   setSortField: function (field, direction) {
       this.sortField = field;
       this.sortDirection = direction;
   },

   comparator: function (m) {
       return m.get(this.sortField);
   },

   // Overriding sortBy (copied from underscore and just swapping left and right for reverse sort)
   sortBy: function (iterator, context) {
       var obj = this.models,
           direction = this.sortDirection;

       return _.pluck(_.map(obj, function (value, index, list) {
           return {
               value: value,
               index: index,
               criteria: iterator.call(context, value, index, list)
           };
       }).sort(function (left, right) {
           // swap a and b for reverse sort
           var a = direction === "ASC" ? left.criteria : right.criteria,
               b = direction === "ASC" ? right.criteria : left.criteria;

           if (a !== b) {
               if (a > b || a === void 0) return 1;
               if (a < b || b === void 0) return -1;
           }
           return left.index < right.index ? -1 : 1;
       }), 'value');
   }

});

সুতরাং আপনি এটি ব্যবহার করতে পারেন:

var collection = new SortedCollection([
  { name: "Ida", age: 26 },
  { name: "Tim", age: 5 },
  { name: "Rob", age: 55 }
]);

//sort by "age" asc
collection.setSortField("age", "ASC");
collection.sort();

//sort by "age" desc
collection.setSortField("age", "DESC");
collection.sort();

এই সমাধানটি ক্ষেত্রের ধরণের উপর নির্ভর করে না।


4
ভাল একটা ! "শূন্য 0" "অপরিজ্ঞাত" দ্বারা প্রতিস্থাপিত হতে পারে।
GMO

3
// For numbers, dates, and other number-like things
var things = new Backbone.Collection;
things.comparator = function (a, b) { return b - a };

// For strings
things.comparator = function (a, b) {
  if (a === b) return 0;
  return a < b ? -1 : 1;
};

2

যারা কেবলমাত্র বর্তমান ক্রমটি ফ্লিপ করতে চান তাদের জন্য এখানে একটি সহজ সমাধান is আপনার যদি এমন কোনও টেবিল থাকে যার কলাম দুটি দিক দিয়ে অর্ডার করা যেতে পারে।

collection.models = collection.models.reverse()

আপনি যদি টেবিল কেস (কফিসক্রিপ্ট) এর প্রতি আগ্রহী হন তবে আপনি এটির মতো এই জাতীয় কিছু সংযুক্ত করতে পারেন:

  collection.comparator = (model) ->
    model.get(sortByType)

  collection.sort()

  if reverseOrder
    collection.models = collection.models.reverse()

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

1

আইডিতে বিপরীত অর্ডারের জন্য:

comparator: function(object) { return (this.length - object.id) + 1; }

0

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

সমস্ত কেস কাজ করার জন্য এটি মোটামুটি পরিমাণে হাঁকিয়েছে (যেখানে মানগুলি স্ট্রিং, খালি স্ট্রিং, তারিখ, সংখ্যা হতে পারে be তবে আমি মনে করি এটি বেশ কাছাকাছি)।

    inverseString: function(str)
    {
        return str.split("").map(function (letter) { return String.fromCharCode(-(letter.charCodeAt(0))); }).join("");
    }
    getComparisonValue: function (val, desc)
    {
        var v = 0;
        // Is a string
        if (typeof val === "string")
        {
            // Is an empty string, upgrade to a space to avoid strange ordering
            if(val.length === 0)
            {
                val = " ";
                return desc ? this.inverseString(val) : val;
            }                

            // Is a (string) representing a number
            v = Number(val);
            if (!isNaN(v))
            {
                return desc ? -1 * v : v;
            }
            // Is a (string) representing a date
            v = Date.parse(val);
            if (!isNaN(v))
            {
                return desc ? -1 * v : v;
            }
            // Is just a string
            return desc ? this.inverseString(val) : val;
        }
        // Not a string
        else
        {
            return desc ? -1 * val : val;
        }
    },

ব্যবহার:

    comparator: function (item)
    {
        // Store the collumn to 'sortby' in my global model
        var property = app.collections.global.get("sortby");

        // Store the direction of the sorting also in the global model
        var desc = app.collections.global.get("direction") === "DESC";

        // perform a comparison based on property & direction
        return this.getComparisonValue(item.get(property), desc);
    },

0

আমি সম্পূর্ণরূপে মডেল অ্যারে বিপরীত করতে বাছাই ফাংশন ওভাররড। এছাড়াও আমি বিপরীতটি সম্পূর্ণ না হওয়া অবধি 'বাছাই' ইভেন্টটি ট্রিগার বন্ধ করেছিলাম।

    sort : function(options){

        options = options || {};

        Backbone.Collection.prototype.sort.call(this, {silent:true});
        this.models.reverse();

        if (!options.silent){
            this.trigger('sort', this, options);
        }

        return this;
    },

0

সম্প্রতি এই ইস্যুতে দৌড়েছে এবং কেবল একটি রোর্টপোর্ট পদ্ধতি যুক্ত করার সিদ্ধান্ত নিয়েছে।

    Collection = Backbone.Collection.extend({
            comparator:function(a, b){
                return a>b;
            },
            rsort:function(){
                var comparator = this.comparator;

                this.comparator = function(){
                    return -comparator.apply(this, arguments);
                }
                this.sort();

                this.comparator = comparator;

            }
    });

আশা করি কেউ এই কাজে লাগবে


0

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

 var reverseCollection = _.sortBy(this.models, function(model) {
   return self.indexOf(model) * -1;
 });

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