2017-02-21 7 views
-1

ng-repeatを使用してテーブルにデータを格納する配列があります。私は、特定の変数columnFilterの値に基づいて配列をフィルタリングするフィルタをコントローラに適用しています。今、私はその変数を変更すると私のテーブルビューは更新されていません。つまり、変数が変更されると、フィルタは再適用されません。 | filter: expression構文を使用する方法を伝えるすべての答えにコントローラでフィルタを使用する場合、ng-repeat配列を更新します。

JS

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

 

 
function MyCtrl($scope, $filter) { 
 
    $scope.name = 'Superhero'; 
 
    $scope.col={name:""}; 
 
    $scope.TableData = [{ 
 
     name: "2017/03/01-14", 
 
     specification: "1wk", 
 
    }, 
 
    { 
 
     name: "2017/03/01-17", 
 
     specification: "Set-04", 
 
    }, 
 
    { 
 
     name: "2017/03/04-11", 
 
     specification: "1wk", 
 
    }, 
 
    { 
 
     name: "2017/04/01-14", 
 
     specification: "1wk", 
 
    }, 
 
    { 
 
     name: "2017/03/10-10", 
 
     specification: "Set-04", 
 
    }, 
 
    { 
 
     name: "2017/03/10-10", 
 
     specification: "Set-04", 
 
    } 
 
    $scope.TableDataFiltered = $filter('filter')($scope.TableData, $scope.col); 
 
}

HTML
<div ng-controller="MyCtrl"> 
 
<input type="text" ng-model="col.name"> 
 
<table> 
 
<thead> 
 
    <tr> 
 
    <th>name</th> 
 
    <th>spec</th> 
 
    </tr> 
 
</thead> 
 
<tbody> 
 
    <tr ng-repeat="item in TableDataFiltered"> 
 
    <td>{{item.name}}</td> 
 
    <td>{{item.specification}}</td> 
 
    </tr> 
 
</tbody> 
 
</table> 
 
</div>


、私はそれについて知っているが、実際のアプリは他のフィルタを持っていますコントローラ自体をフィルタリングする必要があります。 (私はそれが私の上だが、その点は非常に明確にしない最小限の例を提供していない)

+0

_ "フィルタは再適用していません" _手動でフィルタすることを選択したので、必要なときにフィルタを自分で適用する必要があります。あなたは '$ scope。$ watch()'はうまくいきませんでした。なにが問題だったの? – zeroflagL

+0

@zeroflagL問題はありませんでした。何もしませんでした。フィルタが更新されると、私のテーブルは更新されません。私はそれが更新されているかどうかを確認するために、フィルタ変数の出力をチェックしています。問題は、何らかの理由でng-repeatがリフレッシュしていないことです。 – ChaoticTwist

答えて

0

コントローラで$scope.TableDataFilteredを定義する必要が、ちょうどあなたのテンプレートでフィルタを使用します。

<tr ng-repeat="item in TableDataFiltered | filter : col.name">

+0

私はそれについて知っています。コントローラーにフィルターを定義する必要があるので、その質問に尋ねられます。 – ChaoticTwist

0

あなただけのインラインsynthaxを使用し、このために特定の機能を記述する必要はありません。

<tbody> 
    <tr ng-repeat="item in TableDataFiltered | filter: col.name"> 
    <td>{{item.name}}</td> 
    <td>{{item.specification}}</td> 
    </tr> 
</tbody> 
+0

私はそれについて知っています。コントローラーにフィルターを定義する必要があるので、その質問に尋ねられます。 – ChaoticTwist

0

あなたのhtml角度からフィルタを使用する場合、それが使用する変数を見て、再評価表現たびにそれをします変更。あなたのコードからフィルタを呼び出したい場合は、同じことを行う必要があります:

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


function MyCtrl($scope, filterFilter) { 
    $scope.name = 'Superhero'; 
    $scope.col={name:""}; 
    $scope.TableData = [...]; 

    $scope.$watch('col', function(newCol) { 
     $scope.TableDataFiltered = filterFilter($scope.TableData, newCol); 
    }); 
} 

注意また、あなたが直接使用するフィルターを注入できることを、あなたは上でそれを見てする必要はありませんフィルタプロバイダごとに毎回。ドキュメントから:このため

、 あなたのコントローラ/サービス/ディレクティブにフィルター>名前< FILTERNAMEとの依存関係を注入。例えば。 numberと呼ばれるフィルタは、dependency numberFilterを使用して挿入された です。注入された引数 は、第1引数としてフォーマットする値と、第2引数で始まる フィルタパラメータをとる関数です。

あなたは、コントローラからのフィルタを使用するつもりなら、あなたはおそらく、その場合には、あなたはそれ普通の変数作ることができ、$scopeでフィルタリングされていないデータを公開する必要がある、または移動しないことに注意コントローラからのテーブルデータをサービスに変換します。そうすれば、データを使ってコントローラー(制御しているはずのもの)を乱雑にすることを避けることができます。

+0

詳細な回答ありがとうございます。 $ scope()関数を使ってみましたが、うまくいきませんでした。 (私は毎回フィルタープロバイダーを使用するのが嫌ですが、それを覚えておいてください:)) – ChaoticTwist

+1

また、コードスニペットを短くするために、コントローラー内のすべてのテーブルデータを宣言しました。私の実際のプログラムでは、データはサービスを通じて提供されます。 – ChaoticTwist

+0

私を訂正してください。しかし、私の理解によれば、scope変数の変更ごとにダイジェストサイクルが呼び出されます。 「TableDataFiltered」を変更するたびに、UIレンダリングでダイジェストサイクルがトリガーされます。したがって、テーブルデータがコントローラの一部ではない場合があります。その場合は、スコープデータを強制的に更新する必要があります。更新されたデータをUIで取得するようにします。これはあなたを助けるかもしれません[リンク] http://stackoverflow.com/questions/19744462/update-scope-value-when-service-data-is-changed – Yauza

関連する問題