2013-10-25 17 views
8

私はこのフレームワークには新しいので、Angularjsを練習し、ウェブサイトで入手できるチュートリアルに従ってください。Angular.jsの検索フィルター、

の例では、我々は、テーブルに存在するデータを検索することができたがあり、 例は以下のとおりである、私は2つの異なる入力すなわち検索を利用して携帯電話を検索できるようにしています上記のコードではここ

<!DOCTYPE html> 
<html ng-app="SmartPhoneApp"> 
<head> 
    <title>Smart phone Angular</title>  
    <script type="text/javascript" src="D:/Rahul Shivsharan/Installers/AngularJS/angular.js"></script> 
    <script type="text/javascript"> 
     var smartPhoneApp = angular.module("SmartPhoneApp",[]); 

     smartPhoneApp.controller("phoneCtrl",function($scope){ 
      $scope.phones = [ 
       { 
        "modelName" : "LUMIA 520", 
        "companyName" : "NOKIA" 
       }, 
       { 
        "modelName" : "GALAXY S Series", 
        "companyName" : "SAMSUNG" 
       }, 
       { 
        "modelName" : "CANVAS", 
        "companyName" : "MICROMAX" 
       }, 
       { 
        "modelName" : "OPTIMUS", 
        "companyName" : "LG"       
       } 
      ]; 

     }); 
    </script> 
</head> 
<body> 
    Search by Model Name : <input ng-model="comp.modelName" /> 
    Search by Company : <input ng-model="comp.companyName" /> 
    <div ng-controller="phoneCtrl"> 
     <table ng-repeat="phone in phones | filter: comp"> 
      <tr> 
       <td>{{phone.modelName}}</td> 
       <td>{{phone.companyName}}</td> 
      </tr> 
     </table> 
    </div> 
</body> 
</html> 

モデル名と上記のコードは正常に動作 会社名による検索、

しかし、私が選択したオプションに存在する検索の種類を使用して検索する必要がある場合はどのような、

コードで

<!DOCTYPE html> 
<html ng-app="EmployeeApp"> 
<head> 
    <title>Orderring People</title>  
    <script type="text/javascript" src="D:/Rahul Shivsharan/Installers/AngularJS/angular.js"></script> 
    <script type="text/javascript"> 
     var employeeApp = angular.module("EmployeeApp",[]); 
     employeeApp.controller("empCtrl",function($scope){ 
      $scope.employees = [ 
       { 
        "name" : "Mahesh Pachangane", 
        "company" : "Syntel India Pvt. Ltd", 
        "designation" : "Associate" 
       }, 
       { 
        "name" : "Brijesh Shah", 
        "company" : "Britanica Software Ltd.", 
        "designation" : "Software Engineer" 
       }, 
       { 
        "name" : "Amit Mayekar", 
        "company" : "Apex Solutions", 
        "designation" : "Human Resource" 
       }, 
       { 
        "name" : "Ninad Parte", 
        "company" : "Man-made Solutions", 
        "designation" : "Senior Architect" 
       }, 
       { 
        "name" : "Sunil Shrivastava", 
        "company" : "IBM", 
        "designation" : "Project Lead" 
       }, 
       { 
        "name" : "Pranav Shastri", 
        "company" : "TCS", 
        "designation" : "Senior Software Engineer" 
       }, 
       { 
        "name" : "Madan Naidu", 
        "company" : "KPMG", 
        "designation" : "Senior Associate" 
       }, 
       { 
        "name" : "Amit Gangurde", 
        "company" : "Amazon", 
        "designation" : "Programe Manager" 
       } 
      ]; 
      $scope.orderProp="name";     
     }); 
    </script> 
</head> 
<body ng-controller="empCtrl">  
    <table> 
     <tr> 
      <td align="right">Search :</td> 
      <td><input ng-model="query" /></td> 
     </tr>   
     <tr> 
      <td align="right">Search By :</td> 
      <td> 
       <select ng-model="query"> 
        <option value="name">NAME</option> 
        <option value="company">COMPANY</option> 
        <option value="designation">DESIGNATION</option> 
       </select> 
      </td> 
     </tr> 
    </table> 
    <hr> 
    <div> 
     <table> 
      <tr> 
       <th>Employee Name</th> 
       <th>Company Name</th> 
       <th>Designation</th> 
      </tr> 
      <tr ng-repeat="emp in employees | filter:query"> 
       <td>{{emp.name}}</td> 
       <td>{{emp.company}}</td> 
       <td>{{emp.designation}}</td> 
      </tr> 
     </table> 
    </div> 
</body> 
あなたは私が達成しようとしていていることがわかります上記のコードから

は、「名前」、「当社」または「指定」で選択ボックス内に存在サーチ従業員をされ、次のように、

です

しかし、私はここで間違っつもりです、

NG-モデルクエリーが 、右のマッピングをピックアップしていないか、私は間違った方法でやっているかもしれ、

あなたのコードは、常に文字列を送信しながら、

あなたは、コードの

どの部分iは、

+0

http://www.angulartutorial.net/2015/04/angular-js-basic-search-and-filter-data.html – Prashobh

答えて

25

私はplunkrを作成しました。フィルタリングする検索クエリのプロパティを定義できます。 選択する場合は、フィルタリングするプロパティを選択し、検索クエリに割り当てます。

http://plnkr.co/edit/XklvXtc1AZpndjLvXrh8?p=preview

+0

感謝を使用しているフィルターの参照です。これは役に立ちました:) – Miles

+0

とても良い、私はそれを2倍upvoteしたい –

3

あなたは、フィルタキーを指定するには、オブジェクトの使用を参照してください例を変更する必要があり、私はこれを実現する方法を教えてくださいすることができますこれが主な問題の原因です。

検索フィールドに「e」と入力したとします。 「Search by」を選択しないと、フィルターはすべてのキー値で「e」を検索します。 「Search by」から値を選択すると、クエリ文字列は現在のオプションの値( "name"、 "company"または "designation")になり、 "e"と同じ状況で処理されます。テストデータに一致するものはありません。

「検索」を選択する適切な方法は、選択されたオプションという名前の単一のキーを持つオブジェクトを検索クエリと同じように構成することです。だから、「SH」と名のユーザーを検索すると、それは次のようになります。まだ選ばれたnoオプションは、プロパティは「$」と命名されるべきでない場合には

{ 
    name: "sh" 
} 

、このようフィルタはすべてのプロパティの中で検索します。

コードを意図したとおりに修正しました(link)。これを実装する方法は別の質問ですが、$ scopeでqueryFilterオブジェクトを定義し、目的のフォーマットのオブジェクトを返すgetterを使用しました。

.controller("empCtrl", function($scope) { 
    Object.defineProperty($scope, "queryFilter", { 
     get: function() { 
      var out = {}; 
      out[$scope.queryBy || "$"] = $scope.query; 
      return out; 
     } 
    }) 
... 
<body ng-controller="empCtrl">  
    <table> 
     <tr> 
      <td align="right">Search :</td> 
      <td><input ng-model="query" /></td> 
     </tr>   
     <tr> 
      <td align="right">Search By :</td> 
      <td> 
       <select ng-model="queryBy"> 
        <option value="name">NAME</option> 
        <option value="company">COMPANY</option> 
        <option value="designation">DESIGNATION</option> 
       </select> 
      </td> 
     </tr> 
    </table> 
    <hr> 
    <div> 
     <table> 
      <tr> 
       <th>Employee Name</th> 
       <th>Company Name</th> 
       <th>Designation</th> 
      </tr> 
      <tr ng-repeat="emp in employees | filter:queryFilter"> 
       <td>{{emp.name}}</td> 
       <td>{{emp.company}}</td> 
       <td>{{emp.designation}}</td> 
      </tr> 
     </table> 
    </div> 
</body> 
0

シンプルかつ柔軟jsfiddle

以下は、私が

app.filter('tableSearch', function() { 
    return function (list, query, fields) { 
     if (!query) { 
      return list; 
     } 
     query = query.toLowerCase().split(' '); 
     if (!angular.isArray(fields)) { 
      fields = [fields.toString()]; 
     } 
     return list.filter(function (item) { 
      return query.every(function (needle) { 
       return fields.some(function (field) { 
        var content = item[field] != null ? item[field] : ''; 

        if (!angular.isString(content)) { 
         content = '' + content; 
        } 

        return content.toLowerCase().indexOf(needle) > -1; 
       }); 
      }); 
     }); 
    }; 
}) 
関連する問題