2016-11-30 7 views
0

私は、ui-selectを使ってangleでlitlleプログラムを書いた。そして私は、異なるフィールドでOR検索を行うフィルタを書いた。ここで

は私のフィルタである:(完璧に動作whic)

app.filter('orSearchFilter', function($parse) { 
return function(items, props) { 
    var out = []; 

    if (angular.isArray(items)) { 
    var keys = Object.keys(props); 

    items.forEach(function(item) { 
     var itemMatches = false; 

     for (var i = 0; i < keys.length; i++) { 
     var prop = $parse(keys[i])(item); 
     var text = props[keys[i]].toLowerCase(); 

     if (prop && prop.toString().toLowerCase().indexOf(text) !== -1) { 
      itemMatches = true; 
      break; 
     } 
     } 

     if (itemMatches) { 
     out.push(item); 
     } 
    }); 
    } else { 
    out = items; 
    } 

    return out; 
}; 
}); 

そして、ここに私の元plunker(作品)です:http://plnkr.co/edit/IdqO5dtLXmC6gtqLxRdP?p=preview

問題は、私のフィルタはならないことですジェネリックであり、コントローラの中で最終コードに使用します。だから私はそれを付けたい。

$scope.orSearchFilter = function($parse) { 
    return function(items, props) { 
     var out = []; 

     if (angular.isArray(items)) { 
     var keys = Object.keys(props); 

     items.forEach(function(item) { 
      var itemMatches = false; 

      for (var i = 0; i < keys.length; i++) { 
      var prop = $parse(keys[i])(item); 
      var text = props[keys[i]].toLowerCase(); 

      if (prop && prop.toString().toLowerCase().indexOf(text) !== -1) { 
       itemMatches = true; 
       break; 
      } 
      } 

      if (itemMatches) { 
      out.push(item); 
      } 
     }); 
     } else { 
     out = items; 
     } 

     return out; 
    }; 
    }; 

最後に、私のhtmlで、私はこの新しいと呼ばれる(...私はすべての変更をしなかった):ここでは

は、コントローラに接続されているフィルタの 新しいバージョンですこのラインを使用してフィルタ:

<ui-select-choices group-by="groupByLetter" 
repeat="contract in (contracts | 
filter : orSearchFilter(contracts, {id.id: $select.search, policy.info.name : $select.search }) | 
orderBy: 'name') track by contract.name"> 
     {{contract.name}} - {{contract.value}} ---- {{contract.id.id}} *** {{contract.policy.info.name }} 
</ui-select-choices> 

あなたは私がその問題を解決し、コントローラのスコープにこのフィルターを取り付けるために私を助けるために助けてくださいことはできますか?

ありがとうございました!

+0

このようにするとどのようなユースケースですか?それはむしろ奇妙です。 – maurycy

+0

これは一般的なフィルタにしないことです(私はすでに数回だけコントローラ内で使用することを知っているためです)。それが私がコントローラの範囲にそれを取り付ける理由です! – salamanka44

+0

IMHOそれはあまり意味がありません、あなたはすでにテンプレート '{{whatever |またはsearchFilter:searchObject}} 'またはjavascript' $ filter( 'orSearchFilter')(何でも、searchObject) 'に追加し、コントローラーで余分なロジックを追加するだけで、不要なコードで汚染されます。 – maurycy

答えて

0

$filter serviceを使用すると、プログラムによってフィルタ機能を取得できます。

//Don't forget to inject $filter in your controller ofcourse 
$scope.orSearchFilter = $filter('orSearchFilter'); 
+0

問題は、JavaScript側ではなく、HTML側でフィルタを使用することではありません.... – salamanka44

+0

@ salamanka44あなたはすでにあなたのビューであなたのビューでそれを使用していますか? –

0

スコープに直接フィルタを取り付け:もちろん

/* REMOVE constructor function 
    $scope.orSearchFilter = function($parse) { 
    return function(items, props) { 
*/ 
// INSTEAD 
    $scope.orSearchFilter = function(items, props) { 
     var out = []; 

     //... 

     return out; 
    }; 
//}; 

、また$parseは、コントローラ構築機能の注射剤に添加されることを確認します。

関連する問題