Javascript 在控制器中使用筛选器时更新ng repeat数组

Javascript 在控制器中使用筛选器时更新ng repeat数组,javascript,angularjs,Javascript,Angularjs,我有一个数组,我用它来填充一个使用ng repeat的表。我正在控制器中应用一个过滤器,它根据某个变量的值过滤数组。现在,如果我更改该变量,我的表视图将不会得到更新。即,一旦变量发生变化,过滤器不会重新应用 JS var myApp=angular.module('myApp',[]); 函数MyCtrl($scope$filter){ $scope.name='Superhero'; $scope.col={name:”“}; $scope.TableData=[{ 名称:“2017/03/0

我有一个数组,我用它来填充一个使用ng repeat的表。我正在控制器中应用一个过滤器,它根据某个变量的值过滤数组。现在,如果我更改该变量,我的表视图将不会得到更新。即,一旦变量发生变化,过滤器不会重新应用

JS
var myApp=angular.module('myApp',[]);
函数MyCtrl($scope$filter){
$scope.name='Superhero';
$scope.col={name:”“};
$scope.TableData=[{
名称:“2017/03/01-14”,
规格:“1wk”,
},
{
名称:“2017/03/01-17”,
规格:“Set-04”,
},
{
名称:“2017/03/04-11”,
规格:“1wk”,
},
{
名称:“2017/04/01-14”,
规格:“1wk”,
},
{
名称:“2017/03/10-10”,
规格:“Set-04”,
},
{
名称:“2017/03/10-10”,
规格:“Set-04”,
}
$scope.tabledatafilter=$filter('filter')($scope.TableData,$scope.col);

}
无需在控制器中定义
$scope.TableDataFiltered
,只需在模板中使用filter即可:


您不需要为此编写特定函数,只需使用内联synthax:

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

{{item.name}
{{item.specification}}

当您从html中使用筛选器时,您将观察它使用的变量,并在表达式发生更改时重新计算表达式。如果您想从代码中调用筛选器,则需要执行相同的操作:

var myApp=angular.module('myApp',[]);
函数MyCtrl($scope,filterFilter){
$scope.name='Superhero';
$scope.col={name:”“};
$scope.TableData=[…];
$scope.$watch('col',函数(newCol){
$scope.tabledatafilter=filterFilter($scope.TableData,newCol);
});
}
另外请注意,您可以直接插入要使用的筛选器,而不必每次都在筛选器提供程序上查找它。从文档:

为此,将名为Filter的依赖项注入到 您的控制器/服务/指令。例如,名为number的筛选器 通过使用dependency numberFilter注入。注入的参数 是将要格式化的值作为第一个参数的函数,并且 筛选以第二个参数开头的参数


请注意,如果要使用控制器中的筛选器,则可能不需要公开
$scope
中未筛选的数据,在这种情况下,您可以将其设置为普通变量,或将表数据从控制器移动到服务中。这样可以避免控制器混乱(应该控制数据)。

感谢您提供的详细答案。我尝试使用$scope.$watch()函数,但不起作用。(我有一个每次都使用筛选器提供程序的坏习惯,请记住:)此外,为了缩短代码段,我声明了控制器中的所有tabledata。在我的实际程序中,数据是通过服务提供的。请纠正我的错误,但根据我的理解,angular会为范围变量的每次更改调用摘要循环。因此,无论何时更改“TableDataFiltered”它应该在UI呈现上触发摘要循环。因此,可能表数据不是控制器的一部分,因此在这种情况下,您需要强制更新范围数据。这样您就可以在UI上获得更新的数据。这可能有助于您[链接]我知道。需要在控制器中定义筛选器,这就是问题的原因。我知道。需要在控制器中定义筛选器,这就是问题的原因。“筛选器没有重新应用”您选择手动筛选,因此您有责任在必要时自行应用筛选。您提到
$scope.$watch()
不起作用。问题出在哪里?@zeroflagL没有问题,只是什么也没做。当过滤器更新时,我的表没有更新。我正在检查过滤器变量的输出,看它是否得到更新。问题是ng repeat由于某种原因没有刷新。