【问题标题】:AngularJS ng-repeat filter works when hardcoded but not when passed as controller variableAngularJS ng-repeat 过滤器在硬编码时有效,但在作为控制器变量传递时无效
【发布时间】:2017-04-15 03:37:01
【问题描述】:

所以我想制作一个下拉菜单,像这样更改 ng-repeat 的过滤器值:

  <div ng-repeat="{{filter}}">

所以我在控制器中有这条线,现在是硬编码的

  $scope.filter = 'lang in langs | filter:{type:\'Interpreted\'}';

我可以验证 {{filter}} 确实吐出了字符串,但是当将该字符串作为双括号变量给出时,ng-repeat 不起作用,只有当它被硬编码时。你不能传递角度控制器变量到其他角度函数,如 ng-repeat?

【问题讨论】:

  • ng-repeat="filter" 不行吗?
  • ng-repeat 已经解析了变量,所以不需要花括号{{ }},你可以在像class="{{ cond ? 'black' : 'white' }}"这样的非ng属性中使用花括号
  • 为什么不将表达式直接放在ngRepeat 指令中。这更具可读性。请记住:AngularJS 允许您为应用程序扩展 HTML 词汇表。由此产生的环境非常具有表现力、可读性和快速开发。目前,如果不查看控制器内部,很难看到您的 ngRepeat 指令在做什么。至少变量名更符合语义。
  • @Ananth 关于括号你是对的,但不,那是行不通的。
  • @cnorthfield 因为会赋值给控制器中某个函数确定的变量,所以最终结果会是一个下拉菜单来改变过滤器

标签: javascript html angularjs angularjs-ng-repeat


【解决方案1】:

为什么不简单地将$filter 服务注入您的控制器并在那里进行过滤。您可以像这样简单地过滤控制器中的语言:

$scope.filteredLangs = $filter('filter')($scope.langs, {type:'Interpreted'});

然后您可以通过 ngRepeat 指令重复过滤后的语言:

<div ng-repeat="lang in filteredLangs">

请记住,ngRepeat 指令会计算表达式,因此您不需要像示例中那样使用花括号。

如果您只是想更改过滤器中的类型,那么只需更新控制器中的变量:

$scope.myType = "Interpreted";

在视图中:

<div ng-repeat="lang in langs | filter: {type: myType}">

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    相关资源
    最近更新 更多