আঙ্গুলের ফিল্টারগুলিতে যুক্তিগুলি পাস করা


99

ফিল্টার ফাংশনে কোনও যুক্তি পাস করা সম্ভব হয় যাতে আপনি কোনও নাম দিয়ে ফিল্টার করতে পারেন?

কিছুটা এইরকম

$scope.weDontLike = function(item, name) {
    console.log(arguments);
    return item.name != name;
};

উত্তর:


223

প্রকৃতপক্ষে আরও একটি (সম্ভবত আরও ভাল সমাধান) রয়েছে যেখানে আপনি কৌণিকের স্থানীয় 'ফিল্টার' ফিল্টারটি ব্যবহার করতে পারেন এবং এখনও আপনার কাস্টম ফিল্টারটিতে যুক্তিগুলি পাস করতে পারেন।

নিম্নলিখিত কোড বিবেচনা করুন:

<div ng-repeat="group in groups">
    <li ng-repeat="friend in friends | filter:weDontLike(group.enemy.name)">
        <span>{{friend.name}}</span>
    <li>
</div>

এই কাজটি করতে আপনি কেবল নিজের ফিল্টারটিকে নিম্নলিখিত হিসাবে সংজ্ঞায়িত করেছেন:

$scope.weDontLike = function(name) {
    return function(friend) {
        return friend.name != name;
    }
}

আপনি এখানে দেখতে পাচ্ছেন, WeDontLike আসলে অন্য একটি ফাংশন দেয় যা আপনার পরামিতিটির সুযোগে পাশাপাশি ফিল্টার থেকে আসা আসল আইটেমটি দেয়।

আপনি এটি করতে পারেন বুঝতে পেরে আমাকে 2 দিন সময় লেগেছিল, এখনও কোথাও এই সমাধানটি দেখেনি।

চেকআউট একটি angular.js ফিল্টারের বিপরীত প্রান্তিকতা কিভাবে আপনি ফিল্টার অন্যান্য দরকারী অপারেশনের জন্য এই ব্যবহার করতে পারেন দেখুন।


আপনার ফিল্টারটিতে একাধিক যুক্তি প্রয়োজন হলে দেখুন, আমি একাধিক যুক্তি সহ একটি Angular.js ফিল্টারকে কীভাবে কল করব?
nh2

এই পদ্ধতিটি এমন একটি উদ্ভট সমস্যাও সমাধান করেছে যেখানে এনজি-পুনরাবৃত্তির ভিতরে আমি আমার নিজের ফিল্টারগুলিতে আমার নিজস্ব পরামিতিগুলি দিতে পারি না। আমি কী করলাম তা তারা সূচক এবং সামগ্রিক সংগ্রহ হিসাবে ফিরে আসতে থাকবে। এই রিটার্ন পদ্ধতিটি করে আমি আমার পরামিতিগুলি পাস করতে সক্ষম হয়েছি এবং এখনও মূল উপাদানটি লোড করতে পারি, দুর্দান্ত ফিক্স!
ডেনিস স্মোলেক

এই উত্তরটি আমার সমস্যার সমাধান করেছে যেখানে আমি ফিল্টার ফাংশনে প্যারামিটার হিসাবে একটি স্কোপ ভেরিয়েবল পাস করতে সক্ষম হইনি। সেরা সমাধান. উর্ধ্বে!
ভালফার

যদি আমি এটি একাধিকবার উপস্থাপন করতে পারতাম তবে আমি নিশ্চিত করতাম যে এটি এসওর ইতিহাসের সর্বাধিক আপত্তিজনক উত্তর ছিল। এটি বছরের পর বছর ধরে আমার মধ্যে বিচ্ছিন্ন হয়ে পড়েছে ... এবং তারপরে আমি (এখন 2 বছর বয়সী) উত্তরটি পেয়েছি ... আপনাকে অবিশ্বাস্যভাবে অনেক ধন্যবাদ।
পিকেডি

এখনও 2019 এ দরকারী! অনেক ধন্যবাদ.
আশিলন

76

আমি যা বুঝি সেগুলি থেকে আপনি কোনও ফিল্টার ফাংশনে আর্গুমেন্টগুলি পাস করতে পারবেন না ('ফিল্টার' ফিল্টার ব্যবহার করার সময়)। আপনার যা করতে হবে তা হ'ল একটি কাস্টম ফিল্টার লিখুন, এইভাবে:

.filter('weDontLike', function(){

return function(items, name){

    var arrayToReturn = [];        
    for (var i=0; i<items.length; i++){
        if (items[i].name != name) {
            arrayToReturn.push(items[i]);
        }
    }

    return arrayToReturn;
};

এখানে কর্মরত জেএসফিডাল: http://jsfiddle.net/pkozlowski_opensource/myr4a/1/

কাস্টম ফিল্টার না লিখে অন্য সাধারণ বিকল্পটি হ'ল একটি সুযোগে ফিল্টার আউট করার জন্য একটি নাম সঞ্চয় করা এবং তারপরে লিখুন:

$scope.weDontLike = function(item) {
  return item.name != $scope.name;
};

ধন্যবাদ প্রিফেক্ট! সুযোগে নাম সংরক্ষণ করা তেমন ভাল কাজ করবে না কারণ একই পৃষ্ঠায় একই তথ্য থেকে তিনটি তালিকা আমার কাছে রয়েছে বিভিন্ন রাজ্যের (বা নাম) দিয়ে ফিল্টারিং।
shapeshifter

গতিশীলভাবে 'অ্যাডাম' সেট করতে (আপনার জেএসফিডেলকে উল্লেখ করে) কোনও? এনজিওমোডেল এবং কৌনিকটিতে একটি কাস্টম ফিল্টার একত্রিত করা অসম্ভব মনে হচ্ছে (এবং আমি মনে করি যে এটি উদ্দেশ্য ভিত্তিতে) ...
রল্ফ

ফিল্টারের প্যারামিটারগুলি পুনরায় অর্ডার করা সম্ভব? উদাহরণস্বরূপ ফিল্টারের দ্বিতীয় প্যারামিটারে আইটেমটি পাস করবেন?
পুয়া

এটি লক্ষণীয় যে এই উদাহরণে মার্কআপটি {{আইটেম weDontLike: 'thenameyoudont Like'}} ... এটি পেতে এখনই আপনাকে ফিডলে যেতে হবে। আপনার কাস্টম ফিল্টার multiple {আইটেমগুলিতে আপনি একাধিক প্যারামগুলি পাস করতে পারেন তাও লক্ষণীয় weDontLike: 'thename': ['আমি আছি', 'একটি অ্যারে']: 'এবং আরও'} them আপনি তাদের কাস্টম ফিল্টারটিতে অ্যাক্সেস পেতে আরও যুক্তি যুক্ত করতে চান।
বেনিয়ামিন কনান্ট

61

আসলে আপনি একটি প্যারামিটার ( http://docs.angularjs.org/api/ng.filter:filter ) পাস করতে পারেন এবং কেবল এটির জন্য কোনও কাস্টম ফাংশনের প্রয়োজন নেই। আপনি যদি নীচে যেমন আপনার এইচটিএমএলটি পুনরায় লেখেন তবে এটি কাজ করবে:

<div ng:app>
 <div ng-controller="HelloCntl">
 <ul>
    <li ng-repeat="friend in friends | filter:{name:'!Adam'}">
        <span>{{friend.name}}</span>
        <span>{{friend.phone}}</span>
    </li>
 </ul>
 </div>
</div>

http://jsfiddle.net/ZfGx4/59/


8
হ্যাঁ. পার্শ্ব দ্রষ্টব্য - কারও নাম যদি '! অ্যাডাম' হয় তবে আপনি তাকে {নাম: '!! অ্যাডাম' like এর মতো পাবেন}
হনজাজদে

5
আপনি এখানেও এখানে অ্যারে পাস করতে পারেনfilter:['Adam', 'john']
iConnor

6
jsfiddle লিঙ্কটি নষ্ট হয়ে গেছে।
সেরেগেথ্রিন

4
অ্যাডাম সর্বকালের সবচেয়ে খারাপ নাম
বেন হুইলার

6
অ্যাডাম-নট-অ্যাডাম স্পষ্টতই খারাপ।
টিপুন

30

আপনি কেবল টেম্পলেটটিতে এটি পছন্দ করতে পারেন

<span ng-cloak>{{amount |firstFiler:'firstArgument':'secondArgument' }}</span>

ফিল্টার মধ্যে

angular.module("app")
.filter("firstFiler",function(){

    console.log("filter loads");
    return function(items, firstArgument,secondArgument){
        console.log("item is ",items); // it is value upon which you have to filter
        console.log("firstArgument is ",firstArgument);
        console.log("secondArgument ",secondArgument);

        return "hello";
    }
    });

এটি সেরা উত্তর। এটি গতিশীল বস্তুগুলির সাথে কাজ করে। এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
অ্যাবেলবেসনবী

2

পকোজ্লোস্কি.ওপেনসোর্সের উত্তরে প্রসারিত করা এবং জাভাস্ক্রিপ্ট array'sবিল্টিন ফিল্টার পদ্ধতি ব্যবহার করে একটি প্রাকটিকৃত সমাধান হতে পারে:

.filter('weDontLike', function(){
    return function(items, name){
        return items.filter(function(item) {
            return item.name != name;
        });
    };
});

এখানে jsfiddle লিঙ্ক

অ্যারে ফিল্টার আরও এখানে


1

আপনি কৌণিক ফিল্টার একাধিক যুক্তি পাস করতে পারেন!

আমার কৌণিক অ্যাপ্লিকেশন এবং এবং একটি অ্যাপ্লিকেশন স্তরের ভেরিয়েবল সংজ্ঞা দেওয়া হচ্ছে -

var app = angular.module('filterApp',[]);
app.value('test_obj', {'TEST' : 'test be check se'});

আপনার ফিল্টারটি এর মতো হবে: -

app.filter('testFilter', [ 'test_obj', function(test_obj) {
    function test_filter_function(key, dynamic_data) {
      if(dynamic_data){
        var temp = test_obj[key]; 
        for(var property in dynamic_data){
            temp = temp.replace(property, dynamic_data[property]);
        }
        return temp;
      }
      else{
        return test_obj[key] || key;
      }

    }
    test_filter_function.$stateful = true;
    return test_filter_function;
  }]);

এবং এইচটিএমএল থেকে আপনি ডেটা প্রেরণ করবেন:

<span ng-bind="'TEST' | testFilter: { 'be': val, 'se': value2 }"></span>

এখানে আমি ফিল্টার একটি JSON অবজেক্ট পাঠাচ্ছি। আপনি স্ট্রিং বা সংখ্যার মতো কোনও প্রকারের ডেটাও পাঠাতে পারেন।

এছাড়াও আপনি ফিল্টার করতে গতিশীল সংখ্যক আর্গুমেন্ট পাস করতে পারেন, সেক্ষেত্রে আপনাকে সেই যুক্তিগুলি পেতে আর্গুমেন্টগুলি ব্যবহার করতে হবে।

একটি ওয়ার্কিং ডেমো জন্য এখানে যান - কৌণিক ফিল্টার একাধিক যুক্তি পাস


0

আপনি সহজভাবে ব্যবহার করতে পারেন | filter:yourFunction:arg

<div ng-repeat="group in groups | filter:weDontLike:group">...</div>

এবং জেএসে

$scope.weDontLike = function(group) {
//here your condition/criteria
return !!group 
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.