AngularJs এ এনজি-রিপিট দিয়ে কীভাবে (কী, মান) ফিল্টার করবেন?


113

আমি এরকম কিছু করার চেষ্টা করছি:

<div ng-controller="TestCtrl">
    <div ng-repeat="(k,v) in items | filter:hasSecurityId">
        {{k}} {{v.pos}}
    </div>
</div>

কৌণিক জে অংশ:

function TestCtrl($scope) 
{
    $scope.items = {
                     'A2F0C7':{'secId':'12345', 'pos':'a20'},
                     'C8B3D1':{'pos':'b10'}
                   };

    $scope.hasSecurityId = function(k,v)
    {
       return v.hasOwnProperty('secId');
    }
}

তবে একরকম, এটি আমাকে সমস্ত আইটেম দেখাচ্ছে। আমি কী (কী, মান) এ ফিল্টার করতে পারি?


দয়া করে কিছু উদাহরণ ডেটা ফট আইটেম সরবরাহ করুন। বা আমাদের একটি মূর্খতা দিন;)
রবিন ড্রেস্লার

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

আমি ইতিমধ্যে একটি সম্পূর্ণ উদাহরণ দিয়েছি এবং ফিল্টারগুলি কীভাবে ব্যবহার করতে হয় তা আমি জানি। আমি কেবল "কী (কী, মান) দিয়ে ফিল্টার ব্যবহার করব" জিজ্ঞাসা করছি।
ভৈরাল

সূচক এবং গণনা সেই সুযোগে পাওয়া উচিত
আইরিচ

উত্তর:


131

কৌণিক ফিল্টারগুলি কেবল অ্যারেগুলিতে প্রয়োগ করা যেতে পারে এবং কৌণিকের এপিআই থেকে অবজেক্টগুলিতে নয় -

"অ্যারে থেকে আইটেমগুলির একটি উপসেট নির্বাচন করে এবং এটি একটি নতুন অ্যারে হিসাবে ফেরত দেয়" "

আপনার এখানে দুটি বিকল্প রয়েছে:
1) $scope.itemsএকটি অ্যারেতে যান বা -
2) ng-repeatআইটেমগুলি এর আগে প্রাক-ফিল্টার করুন :

<div ng-repeat="(k,v) in filterSecId(items)">
    {{k}} {{v.pos}}
</div>

এবং নিয়ামক:

$scope.filterSecId = function(items) {
    var result = {};
    angular.forEach(items, function(value, key) {
        if (!value.hasOwnProperty('secId')) {
            result[key] = value;
        }
    });
    return result;
}

জেএসফিডাল : http://jsfiddle.net/bmleite/WA2BE/


9
অসীম (ডাইজেস্ট) লুপগুলি এড়াতে এই পদ্ধতির সাথে সতর্ক হওয়া দরকার। দেখুন 6054 এবং 705নারেটেজের সংক্ষিপ্তসার : সংক্ষেপে, এনজি-
জো 23

3
সহায়ক মন্তব্য। এটি আমাকে লুপের জন্য ফেলেছিল; আমি প্রত্যাশিত যে কোনও পুনরাবৃত্ত ফিল্টার করতে সক্ষম হবে । অনেক ধন্যবাদ. :)
ক্রিস ক্র্যাচো

3
দ্রষ্টব্য: এটি এখন নিখুঁত অ্যান্টি-প্যাটার্ন। কৌণিক 1.3 এর এখন স্টেটলেস ফিল্টার রয়েছে ( egghead.io/lessons/… ) সুতরাং আপনি অবশ্যই এর জন্য একটি ফিল্টার তৈরি করতে চান।
কেন্টকড্ডস

8
@ কেন্টকডডস নিখরচায় লিঙ্কগুলি পোস্ট করেন না!
সেবাস্তিয়ান

11
কেন কেবল পুনরাবৃত্ত উপাদানগুলিতে একটি এনজি-যোগ করবেন না?
কার্বনড্রি

45

আমার সমাধানটি কাস্টম ফিল্টার তৈরি করে এটি ব্যবহার করবে:

app.filter('with', function() {
  return function(items, field) {
        var result = {};
        angular.forEach(items, function(value, key) {
            if (!value.hasOwnProperty(field)) {
                result[key] = value;
            }
        });
        return result;
    };
});

এবং এইচটিএমএলে:

 <div ng-repeat="(k,v) in items | with:'secId'">
        {{k}} {{v.pos}}
 </div>

1
তবে এটি n * n বার লুপ করবে।
ম্যাক্সিসাম

27

এছাড়াও আপনি ব্যবহার করতে পারেন ng-repeatসঙ্গে ng-if:

<div ng-repeat="(key, value) in order" ng-if="value > 0">

2
চালাক। এটি অনেক সময় সাশ্রয় করেছে।
সাফওয়ান

21

বা সহজভাবে ব্যবহার

ng-show="v.hasOwnProperty('secId')"

আপডেট হওয়া সমাধানটি এখানে দেখুন:

http://jsfiddle.net/RFontana/WA2BE/93/


1
ধন্যবাদ .. আমি এটি ব্যবহার করেছি তবে ng-ifপরিবর্তে
জিম 13'15

11

আপনি কেবল কৌনিক.ফিল্টার মডিউল ব্যবহার করতে পারেন এবং তারপরে আপনি নেস্টেড বৈশিষ্ট্যগুলি দ্বারাও ফিল্টার করতে পারেন।
দেখুন: jsbin
2 উদাহরণ:

জাতীয়:

angular.module('app', ['angular.filter'])
  .controller('MainCtrl', function($scope) {
  //your example data
  $scope.items = { 
    'A2F0C7':{ secId:'12345', pos:'a20' },
    'C8B3D1':{ pos:'b10' }
  };
  //more advantage example
  $scope.nestedItems = { 
    'A2F0C7':{
      details: { secId:'12345', pos:'a20' }
    },
    'C8B3D1':{
      details: { pos:'a20' }
    },
    'F5B3R1': { secId:'12345', pos:'a20' }
  };
});

এইচটিএমএল:

  <b>Example1:</b>
  <p ng-repeat="item in items | toArray: true | pick: 'secId'">
    {{ item.$key }}, {{ item }}
  </p>

  <b>Example2:</b>
  <p ng-repeat="item in nestedItems | toArray: true | pick: 'secId || details.secId' ">
    {{ item.$key }}, {{ item }}
  </p> 

21
আপনার প্রকাশ করা উচিত যে angular.filterএটি কোনও মূল কৌণিক মডিউল নয় এবং আপনি এর লেখক।
ডেমিসেক্স

দেখে মনে হচ্ছে toArrayফিল্টারটি আর উপস্থিত নেই। একটি প্রতিস্থাপন আছে, কারণ filterফিল্টার এখনও অবজেক্টগুলিকে অনুমতি দেয় না?
ট্রাইসিস

6

এটি এক দেরিতে হলেও আমি একই ধরণের ফিল্টার সন্ধান করেছি এবং এর মতো কিছু ব্যবহার করে শেষ করেছি:

<div ng-controller="TestCtrl">
 <div ng-repeat="(k,v) in items | filter:{secId: '!!'}">
   {{k}} {{v.pos}}
 </div>
</div>

2
আপনি কীভাবে এটি কাজ করতে পেলেন? আমি যখন এনজি-পুনরাবৃত্তি হওয়া অবজেক্টের সাথে ফিল্টার ব্যবহার করি, তখন আমি একটি ত্রুটি পাই যা কৌণিক ডকুমেন্টেশনের ভিত্তিতে প্রত্যাশিত।
টোনস্ট্রাক

1

যদিও এই প্রশ্নটি বরং পুরানো, আমি কৌনিক 1 বিকাশকারীদের জন্য আমার সমাধানটি ভাগ করতে চাই। মূল কথাটি হ'ল মূল কৌণিক ফিল্টারটি পুনরায় ব্যবহার করা, তবে স্বচ্ছভাবে কোনও বস্তুকে অ্যারে হিসাবে পাস করা passing

app.filter('objectFilter', function ($filter) {
    return function (items, searchToken) {
        // use the original input
        var subject = items;

        if (typeof(items) == 'object' && !Array.isArray(items)) {
            // or use a wrapper array, if we have an object
            subject = [];

            for (var i in items) {
                subject.push(items[i]);
            }
        }

        // finally, apply the original angular filter
        return $filter('filter')(subject, searchToken);
    }
});

এটি এর মতো ব্যবহার করুন:

<div>
    <input ng-model="search" />
</div>
<div ng-repeat="item in test | objectFilter : search">
    {{item | json}}
</div>

এখানে একজন লাঞ্ছিতকারী


0

আমি ইতিমধ্যে একাধিক প্রকল্পে ব্যবহার করেছি এমন জেনেরিক ফিল্টারটি আরও কিছু তৈরি করেছি:

  • অবজেক্ট = যে ফিল্টারটি ফিল্টার করা দরকার
  • ক্ষেত্র = সেই বস্তুর মধ্যে ক্ষেত্র যা আমরা ফিল্টার করব
  • ফিল্টার = ফিল্টারটির সাথে ফিল্ডটির মান প্রয়োজন

এইচটিএমএল:

<input ng-model="customerNameFilter" />
<div ng-repeat="(key, value) in filter(customers, 'customerName', customerNameFilter" >
   <p>Number: {{value.customerNo}}</p>
   <p>Name: {{value.customerName}}</p>
</div>

জাতীয়:

  $scope.filter = function(object, field, filter) {
    if (!object) return {};
    if (!filter) return object;

    var filteredObject = {};
    Object.keys(object).forEach(function(key) {
      if (object[key][field] === filter) {
        filteredObject[key] = object[key];
      }
    });

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