angularjs - 如何让这个过滤器变得更好

标签 angularjs angularjs-ng-repeat angularjs-filter

我想让 ng-repeat 为从 select 输入中选择的类(class)运行。

为此,我使用了自定义的过滤器。 每当 arrayFilter 未定义或 arrayFilter 为空时,我都会将 arrayFilter 硬编码为所有值,否则 arrayFilter由从select输入

中选择的值组成

<强> Hereplunker 演示

有没有更好的方法来实现这个功能?

有关我在代码中使用 filter 的方式的任何说明,请参阅 here InviS给出的答案

JS 代码片段

angular.module("myApp",[])
.controller("mainctrl",function($scope){
 $scope.courses = [{"name":"Java"},{"name":"Python"},{"name":"Nodejs"}] ;
  $scope.caller = function(){
     console.log($scope.inputvalue);
  };    
})

.filter('inArray', function($filter){

return function(list, arrayFilter, element){

    if(!angular.isUndefined(arrayFilter)){
      if(arrayFilter.length  ){

      }
      else{
        arrayFilter = ["Java","Python","Nodejs"]
      }
    }
    else{
      arrayFilter = ["Java","Python","Nodejs"]
    }
   return $filter("filter")(list, function(listItem){
              return arrayFilter.indexOf(listItem[element]) != -1;
          });  
}; 
});  

提前致谢。

最佳答案

您可以选择在数组未定义或为空时返回 true,而不是将 arrayFilter 设置为具有这些值的预定义数组:

.filter('inArray', function($filter) {
  return function(list, arrayFilter, element) {
    return $filter("filter")(list, function(listItem) {
      return !arrayFilter || !arrayFilter.length || arrayFilter.indexOf(listItem[element]) !== -1;
    });
  };
});

angular.module("myApp", [])
  .controller("mainctrl", function($scope) {
    $scope.courses = [{
      "name": "Java"
    }, {
      "name": "Python"
    }, {
      "name": "Nodejs"
    }];
    $scope.caller = function() {
      console.log($scope.inputvalue);
    };
  })
  .filter('inArray', function($filter) {
    return function(list, arrayFilter, element) {
      return $filter("filter")(list, function(listItem) {
        return !arrayFilter || !arrayFilter.length || arrayFilter.indexOf(listItem[element]) !== -1;
      });
    };
  });
<!DOCTYPE html>
<html ng-app="myApp">

<head>
  <title>COi</title>

  <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
  <link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.6.5/css/bootstrap-select.css">

  <!-- Latest compiled and minified CSS -->
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">

  <!-- Optional theme -->
  <!-- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap-theme.min.css"> -->

  <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular.min.js"></script>
  <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.4.0-beta.5/angular-animate.min.js"></script>
  <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.6.5/js/bootstrap-select.min.js"></script>
  <link rel="stylesheet" href="style.css">
  <script src="script.js"></script>
  <style>
    .btn-warning {
      background-color: white !important;
      color: black !important;
    }
    .btn-warning:hover {
      background-color: white !important;
    }
  </style>
</head>

<body ng-controller="mainctrl">
  <select class="selectpicker btn-default " multiple ng-change="caller();" ng-model="inputvalue">
    <option>Java</option>
    <option>Python</option>
    <option>Nodejs</option>
  </select>

  <li ng-repeat="course in courses | inArray:inputvalue:'name' ">
    {{course.name}}
  </li>

  <script type="text/javascript" src="bootstrap-select.js"></script>
  <!-- Latest compiled and minified JavaScript -->
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
</body>

</html>

关于angularjs - 如何让这个过滤器变得更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30160256/

相关文章:

javascript - angularjs - Controller 没有加载我的场景

javascript - AngularJS 中的动态 orderBy

javascript - AngularJS新推()'ed item to ngRepeat $Scope doesn' t有效编辑或删除

javascript - 如何使用 ng-init 和 ng-repeat

javascript - 如何为 javascript 调整工作的 html Angular 过滤器

javascript - IE中如何从URL字符串中获取域名

javascript - TinyMCE 标准表情符号不显示在前端

javascript - 将函数表达式存储在 angularjs 指令的链接函数中并通过 ng-click 使用它

javascript - 是否可以将 for 循环迭代值连接到 Angular js 中的 $scope 变量?

angularjs - ng-repeat only objects with specific property value - 自定义过滤器?