テーブルがあり、ユーザーは特定の列とこれらの列の特定の値に基づいて、テーブル内の行をフィルター処理することを選択できます。このフィルターを追跡するためのオブジェクト構造は次のようになります。
$scope.activeFilterAttributes = [
{
"columnName": "city",
"values": ["LA", "OT", "NY"]
},
{
"columnName": "weather",
"values": ["humid", "sunny"]
}
];
したがって、配列内のオブジェクトには「columnName」キーと「values」キーが含まれています。"columnName" はフィルターで考慮する列を示し、"values" にはフィルター値が含まれます。基本的に、上記の配列は、都市の列に値として「LA」、「OT」、または「NY」が含まれ、天気の列に値として「湿った」または「晴れ」が含まれるテーブルの行になります。これらの値を含まない他の行は表示されません。
このオブジェクトをよりよく理解するために、ユーザーが「都市」の列に「LA」または「NY」を含む行のみを表示したい場合、結果の配列は次のようになります。
$scope.activeFilterAttributes = [
{
"columnName": "city",
"values": ["LA", "NY"]
},
{
"columnName": "weather",
"values": []
}
];
ユーザーは、これらのフィルターを設定または削除します。これが発生するたびに、上記の配列が更新されます。この更新は正しく行われ、私はそれを確認しました - ここでは問題ありません。
問題は $watch() にあります。次のコードがあります。
$scope.$watch('activeFilterAttributes', function() {
//Code that should update the rows displayed in the table based on the filter
}}
ユーザーが UI でフィルターを$scope.activeFilterAttributes
更新すると、適切に更新されますが、これが更新されたときに $watch はトリガーされません。アプリケーションが初めてロードされるときにトリガーされますが、その後の更新はこれに影響しません。
これを実証するためにフィドルを作成しました: http://jsfiddle.net/nCHQV/
フィドルで$scope.info
は、いわばテーブルの行を表します。
$scope.data
フィルターを表します。
ボタンをクリックすると、フィルターが更新され (フィドルの場合はデータ)、テーブルに表示される行が更新されます (フィドルの場合は情報)。しかし、ご覧のとおり、ボタンをクリックしても情報は更新されません。
$scope.$watch
オブジェクトの配列が変更されたときにトリガーされるべきではありませんか?