2017-09-13 47 views
1

我无法显示多值表单文本框,即输入的值与我们需要显示匹配值的数组值匹配,对于我只显示一个值。请帮我找出解决方案。 在这个例子中,如果输入“ball”它显示,如果我们输入“ball all”它必须同时显示“ball”“all”但是因为它没有显示bcoz这里我们不返回一个数组如果我赋值给数组,错误。任何人都可以帮我解决我犯的错误。使用过滤器显示数组中多个匹配值

var app = angular.module('angularPracticeApp'); 
 
    app.controller('AppController', function ($scope) { 
 
    $scope.match = {}; 
 
     $scope.words = [ 
 
      { title: "ball", type: 'object' }, 
 
      { title: "wall", type: 'object' }, 
 
      { title: "all", type: 'word' }, 
 
      { title: "alloy", type: 'material' } 
 
     ]; 
 
    
 
}); 
 
    
 
    app.filter('exact', function(){ 
 
    return function(items, match){ 
 
    var matching = [], matches,resultArray = []; 
 
    
 
    angular.forEach(items, function(item){ // e.g. { title: "ball" } 
 
     matches = true; 
 
     angular.forEach(match, function(value, key){ // e.g. 'all', 'title' 
 

 
     \t var stringArray = value.split(/(\s+)/); 
 
\t  console.log(stringArray); 
 
\t  for(var i=0;i<stringArray.length;i++){ 
 
\t  \t if(!!value){ // do not compare if value is empty 
 
       matches = matches && (item[key] === stringArray[i]); 
 
       /* if(item[key] === stringArray[i]){ 
 
\t \t \t  console.log(stringArray[i]); 
 
       resultArray.push(stringArray[i]); 
 
       }*/ 
 
       
 
      } 
 
\t  } 
 
     
 
     }); 
 
     if(matches){ 
 
     \t console.log(resultArray); 
 
     matching.push(item); 
 
     } 
 
    }); 
 
    return matching; 
 
    } 
 
});
<!doctype html> 
 
<html ng-app="plunker"> 
 
    <head> 
 
    <script src="http://code.jquery.com/jquery-2.0.0.min.js"></script> 
 
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script> 
 
    
 
    <script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.0/js/bootstrap.min.js"></script> 
 
    <script src="script.js"></script> 
 
    <link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.0/css/bootstrap-combined.min.css" rel="stylesheet"> 
 
    <link rel="stylesheet" href="main.css" /> 
 
    </head> 
 
    <body ng-controller="AppController"> 
 
    
 
    <div> 
 
    Find words that exactly match title: 
 
    <input ng-model="match.title" /> 
 
    <br> 
 

 
    <table> 
 
     <tr ng-repeat="word in words | exact:match"> 
 
     <td>{{word.title}}</td> 
 
     </tr> 
 
    </table> 
 
    </div> 
 
     
 
    </body> 
 
</html>

回答

0

抱歉无法调试您的过滤器,所以我做了我自己,请用它作为参考。

JSFiddle Demo

JS:

var app = angular.module('myApp', []); 

app.controller('MyController', function MyController($scope) { 

    $scope.match = {}; 
     $scope.words = [ 
      { title: "ball", type: 'object' }, 
      { title: "wall", type: 'object' }, 
      { title: "all", type: 'word' }, 
      { title: "alloy", type: 'material' } 
     ]; 

}); 
app.filter('exact', function($filter){ 
    return function(items, match){ 
    console.log(match); 
    if(Object.keys(match).length !== 0){ 
     match = match.title.split(" "); 
    }else{ 
    console.log("itesm", items); 
     return items; 
    } 
     if(match){ 
      return $filter("filter")(items, function(listItem){ 
       return match.indexOf(listItem.title) != -1; 
      }); 
     } 
    }; 
}); 
+1

谢谢那仁穆拉利它的正常工作。 – raj

+0

@raj不客气:) –

0

好吧,我想我明白你想要什么,我觉得可能是更好的方法。这里的解决方案,我为你准备的,它是干净多了:

http://jsfiddle.net/U3pVM/33950/ HTML:

<div ng-app> 
    <div ng-controller="SomeCtrl"> 
    <div> 
     Find words that exactly match title: 
     <input ng-model="match.title" /> 
     <br> 

     <table> 
     <tr ng-repeat="word in wordsCopy"> 
      <td>{{word.title}}</td> 
     </tr> 
     </table> 
    </div> 
    </div> 
</div> 

和JS:

function SomeCtrl($scope) { 
    $scope.words = [{ 
    title: "ball", 
    type: 'object' 
    }, { 
    title: "wall", 
    type: 'object' 
    }, { 
    title: "all", 
    type: 'word' 
    }, { 
    title: "alloy", 
    type: 'material' 
    }]; 
    $scope.wordsCopy = $scope.words; 
    $scope.$watch('match.title', (newVal, oldVal) => { 
    if (newVal) { 
     $scope.wordsCopy = $scope.words.filter((val, index) => { 
     return newVal.split(' ').indexOf(val.title) !== -1; 
     }); 
    } else { 
     $scope.wordsCopy = $scope.words; 
    } 
    }); 
}; 
+0

太感谢你了PEGLA它的正常工作.. – raj

相关问题