2015-12-18 21 views
14

में दो कस्टम फ़िल्टर के आधार पर डेटा को फ़िल्टर करने के लिए कैसे करें मेरे पास दो कस्टम फ़िल्टर हैं, मैं इन दोनों कस्टम फ़िल्टर का उपयोग करके अपना डेटा फ़िल्टर करना चाहता हूं। लेकिन मैं समस्या का सामना करना पड़ा, तो मैं के बाद एक तो वे अच्छा काम एक का उपयोग किया, लेकिन जब मैं एक ही समय तो कोई उत्पादन में दोनों फिल्टर का उपयोग करने का प्रयास करें। मेरे कोड इस प्रकार है:कोणीय जेएस

<script> 
    var myApp = angular.module('myApp', []); 
    myApp 
.filter('selectedTags', function() { 
    return function(postdata, tags) { 
     return postdata.filter(function(task) { 

      for (var i in task.tarn_list) { 
       if (tags.indexOf(task.tarn_list[i]) != -1) { 
        return true; 
       } 
      } 
      return false; 

     }); 
    }; 
}) 
.filter('selectedDep', function() { 
    return function(postdata, tags) { 
     return postdata.filter(function(task) { 

      for (var i in task.deployment) { 
       if (tags.indexOf(task.deployment[i]) != -1) { 
        return true; 
       } 
      } 
      return false; 

     }); 
    }; 
}) 
.controller('PostList', ['$scope', '$http', function($scope, $http) { 
      var jsonFile='../../json.php'; 
      $http.get(jsonFile).success(function(data) { 
      $scope.postdata = data; 
      }); 
      $scope.useMakes=[] 
      $scope.checkBoxModel={ 
        search:[], 
        ddsearch:[] 
       }; 
      $scope.totalFeatures=features; 
      $scope.deployment=all_deployment; 
     }]); 
</script> 

मेरे div के रूप में पालन करें, जिस पर मैं लागू करना चाहते है फिल्टर:

<div ng-repeat="record in postdata | selectedDep:checkBoxModel.ddsearch | selectedTags:checkBoxModel.search" > 
+0

क्या आप वाकई डेटा जो दोनों फिल्टर को पूरा करती है कि वहाँ रहे हैं? –

+1

मुझे लगता है कि दूसरा फ़िल्टर केवल फ़िल्टर 1 को पारित करने वाले आइटम फ़िल्टर कर सकता है। – angabriel

+0

हाँ, मुझे यकीन है कि ये दोनों फ़िल्टर अच्छी तरह से काम करते हैं। –

उत्तर

3

नहीं वास्तविक डाटासेट भी देखा है, इस लिए यहाँ नाव मुझे लगता है नाव चाहिए - आपके प्रश्नों और लूप की प्रकृति में प्रकट संपत्तियों को दिया गया है;

https://jsfiddle.net/op7m14m1/1/


के बजाय for in छोरों, मैं नेस्टेड फिल्टर (आप क्या कर रहे हैं जो सार में है) के लिए चुन लिया है।

var predicate = []; 

dataset.filter(function (a) { 
    var inner = a.inner.filter(function (b) { 
    return predicate.indexOf(b) > -1; 
    }); 

    return inner.length > 0; 
}); 

दो फिल्टर आप को देखते हुए, आप इसे विभाजित कर सकते हैं एक बाध्य (या में पारित) पैरामीटर हुक्म जो संपत्ति फिल्टर के लिए एक मिलान करने वाले के रूप में उपयोग करने के लिए (रों) के साथ एक एकल समारोह में ।

ऐसा कुछ;

function generic() { 
    return function (prop, dataset, predicate) { 
    return dataset.filter(function (element) { 

     var innards = element[prop].filter(function (iEl) { 
     return predicate.indexOf(iEl) > -1; 
     }); 

     return innards.length > 0; 
    }); 
    } 
} 

और फिर इसका उपयोग करने के लिए आप निम्न कार्य कर सकते हैं;

module.filter('genericFilter', generic); 
module.filter('selectedDep', generic.bind(null, 'deployment'); 
module.filter('selectedTags', generic.bind(null, 'tarn_list'); 

// $filter('genericFilter')('deployment', [], ['a']); 
// $filter('selectedDep')([], ['b']); 
// $filter('selectedTags')([], ['c']); 

इस सेटअप एक भी कार्य के लिए अनुमति देता है, यह है कि आप अपने दिल की सामग्री के लिए पुन: उपयोग कर सकते हैं - बस संपत्ति में पारित आप एक गहरी फिल्टर के करना चाहते हैं, या यह preemptively बाँध।