এনজি-রিপিট-এ কাস্টম সাজানোর কাজ function


113

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

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

সুতরাং প্রশ্নটি হয়ে যায়, আমি কীভাবে একটি কাস্টম বাছাই করব?

<div ng-controller="aggViewport" >
<div class="btn-group" >
    <button ng-click="setOption(opt.name)" ng-repeat="opt in optList" class="btn active">{{opt.name}}</button>
</div>
<div id="container" iso-grid width="500px" height="500px">
    <div ng-repeat="card in cards" class="item {{card.class}}" ng-controller="aggCardController">
        <table width="100%">
            <tr>
                <td align="center">
                    <h4>{{card.name}}</h4>
                </td>
            </tr>
            <tr>
                <td align="center"><h2>{{getOption()}}</h2></td>
            </tr>
        </table>        
    </div>
</div>

এবং নিয়ামক:

module.controller('aggViewport',['$scope','$location',function($scope,$location) {
    $scope.cards = [
        {name: card1, values: {opt1: 9, opt2: 10}},
        {name: card1, values: {opt1: 9, opt2: 10}}
    ];

    $scope.option = "opt1";

    $scope.setOption = function(val){
        $scope.option = val;
    }

}]);

module.controller('aggCardController',['$scope',function($scope){
    $scope.getOption = function(){
        return $scope.card.values[$scope.option];
    }
}]);

উত্তর:


192

আসলে orderByফিল্টারটি প্যারামিটার হিসাবে গ্রহণ করতে পারে কেবল একটি স্ট্রিংই নয় তবে একটি ফাংশনও। orderByডকুমেন্টেশন থেকে : https://docs.angularjs.org/api/ng/filter/orderBy ):

ফাংশন: গেটর ফাংশন এই ফাংশনটির ফলাফল <, =,> অপারেটর ব্যবহার করে বাছাই করা হবে।

সুতরাং, আপনি আপনার নিজের ফাংশন লিখতে পারে। উদাহরণস্বরূপ, আপনি যদি অপট 1 এবং অপ্ট 2 এর যোগফলের ভিত্তিতে কার্ডের তুলনা করতে চান (আমি এটি তৈরি করছি, বিন্দুটি হ'ল আপনি যে কোনও স্বেচ্ছাসেবী কাজ করতে পারেন) আপনি নিজের কন্ট্রোলারে লিখবেন:

$scope.myValueFunction = function(card) {
   return card.values.opt1 + card.values.opt2;
};

এবং তারপরে, আপনার টেমপ্লেটে:

ng-repeat="card in cards | orderBy:myValueFunction"

এখানে কাজ করছে jsFizz

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


এটি দুর্দান্ত, তবে এটির জন্যও ফিল্টার তৈরি করা সম্ভব?
হুগো ডের হাঞ্জিজে

হ্যাঁ, এটি এখনও কাজ করে। এখানে একটি আপডেট সংস্করণ
jahller

ডক্সে একাধিক প্যারাম সম্পর্কে কোনও বিবরণ কেন নেই ?? বিটিডাব্লু: ধন্যবাদ, এটি কাজ করে। :)
mayankcpdixit

আপনি কি জানেন কীভাবে আমি এই পদ্ধতির সাহায্যে একাধিক মানদণ্ড পরিচালনা করতে পারি? আমি কীভাবে মাইভ্যালু ফাংশন থেকে একাধিক মান ফিরিয়ে দিতে পারি?
akcasoy

26

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

যেমন নিম্নলিখিত দায়িত্ব দেওয়া:

$scope.cards = {
  "card2": {
    values: {
      opt1: 9,
      opt2: 12
    }
  },
  "card1": {
    values: {
      opt1: 9,
      opt2: 11
    }
  }
};

এবং নির্দেশনা অনুসারে <ul ng-repeat="(key, card) in cards | orderBy:myValueFunction">, এনজি-পুনরাবৃত্তি "কার্ড 2" এর আগে "কার্ড 1" এর উপরে পুনরাবৃত্তি হতে পারে, সাজানোর ক্রম নির্বিশেষে।

এটির মতো কাজ করার জন্য, আমরা অবজেক্টটিকে একটি অ্যারেতে রূপান্তর করতে একটি কাস্টম ফিল্টার তৈরি করতে পারি এবং তারপরে সংগ্রহটি ফেরার আগে একটি কাস্টম বাছাই ফাংশন প্রয়োগ করতে পারি।

myApp.filter('orderByValue', function () {
  // custom value function for sorting
  function myValueFunction(card) {
    return card.values.opt1 + card.values.opt2;
  }

  return function (obj) {
    var array = [];
    Object.keys(obj).forEach(function (key) {
      // inject key into each object so we can refer to it from the template
      obj[key].name = key;
      array.push(obj[key]);
    });
    // apply a custom sorting function
    array.sort(function (a, b) {
      return myValueFunction(b) - myValueFunction(a);
    });
    return array;
  };
});

আমরা কাস্টম ফিল্টারগুলির সাথে মিলিয়ে (কী, মান) জুটিগুলি পুনরাবৃত্তি করতে পারি না (যেহেতু অ্যারেগুলির জন্য কীগুলি সংখ্যাসূচক সূচক হয়) তাই ইনজেকশনযুক্ত কীগুলির নাম উল্লেখ করতে টেমপ্লেটটি আপডেট করা উচিত।

<ul ng-repeat="card in cards | orderByValue">
    <li>{{card.name}} {{value(card)}}</li>
</ul>

এখানে একটি মিশ্র অ্যারেতে একটি কাস্টম ফিল্টার ব্যবহার করে একটি কার্যকারী ফিডল দেওয়া হয়েছে: http://jsfiddle.net/av1mLpqx/1/

তথ্যসূত্র: https://github.com/angular/angular.js/issues/1286#issuecomment-22193332


1
আমি জানি আমার উচিত ছিল না তবে আমাকে কেবল করতে হবে - ধন্যবাদ।
এলিয়া ওয়েইস

7

নিম্নলিখিত লিঙ্কটি খুব ভাল অ্যাংগুলারে ফিল্টারগুলি ব্যাখ্যা করে। এটি দেখায় যে এনজি-রিপিটের মধ্যে কীভাবে কাস্টম বাছাইয়ের যুক্তি সংজ্ঞা দেওয়া সম্ভব। http://toddmotto.com/everything-about-custom-filters-in-angular-js

বৈশিষ্ট্যগুলির সাথে বস্তু বাছাই করার জন্য, আমি এই কোডটি ব্যবহার করেছি: (দ্রষ্টব্য যে এই সাজ্টটি মানক জাভাস্ক্রিপ্টের বাছাই পদ্ধতি এবং কৌনিকের সাথে নির্দিষ্ট নয়) কলামের নাম সেই সম্পত্তিটির নাম যা বাছাই করতে হবে।

self.myArray.sort(function(itemA, itemB) {
    if (self.sortOrder === "ASC") {
        return itemA[columnName] > itemB[columnName];
    } else {
        return itemA[columnName] < itemB[columnName];
    }
});

0

অর্ডারবাই ফাংশন সহ দিকটি অন্তর্ভুক্ত করতে:

ng-repeat="card in cards | orderBy:myOrderbyFunction():defaultSortDirection"

কোথায়

defaultSortDirection = 0; // 0 = Ascending, 1 = Descending

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