javascript - ng-repeat count - 过滤器更新次数不超过一次

标签 javascript angularjs

我有一个列表,上面附加了一些过滤器。我想计算项目数,如果有 0 个项目,则显示一条消息...

<li ng-repeat="item in items = (items | sortWithTab:tab | filter:search")>
    {{ item.name }}
</li>
<div ng-if="items.length === 0">No items</div>

项目集包含一个带有名称的 tab 字段,并且我有相关按钮可以按该名称进行过滤,这会更新 $scope.tab 名称。

如果我想输出该列表中的项目数,我会执行items.length,这是可行的。但是,如果我尝试返回已按下的选项卡,它不会更新。有谁知道为什么吗?

示例如下:

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

app.controller('SampleCtrl', ['$scope',
      function($scope) {
        
        $scope.tab = 'all';
        
        $scope.changeTab = function(tab)
        {
           $scope.tab = tab;          
        }

        $scope.items = [
          {name: 'One', tab: 'live'},
          {name: 'Two', tab: 'today'},
          {name: 'Three', tab: 'today'},
          {name: 'Four', tab: 'today'},
          {name: 'Five', tab: 'live'},
          {name: 'Six', tab: 'today'},
          {name: 'Seven', tab: 'today'},
          {name: 'Eight', tab: 'live'}
        ];

      }]);

app.filter('sortWithTab', function() {
    
  return function(list, tab) {
    
    var filtered;
    var i;

    if (tab == 'all') {
      
      return list;
      
    } else if (tab == 'today') {
      
      filtered = [];
      for (i = 0; i < list.length; i++) {
        if(list[i].tab == 'today')
          filtered.push(list[i]);
      }
      return filtered;
      
    } else if (tab == 'live') {
      
      filtered = [];
      for (i = 0; i < list.length; i++) {
        if(list[i].tab == 'live')
          filtered.push(list[i]);
      }
      return filtered;
      
    } else {
      
      return list;
      
    }
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app="App" ng-controller="SampleCtrl">
  
  <a ng-click="changeTab('all')">All</a>
  <a ng-click="changeTab('today')">Today</a>
  <a ng-click="changeTab('live')">Live</a>
  
  <ul>
    <li ng-repeat="item in items = (items | sortWithTab:tab)">
      {{ item.name }}
    </li>
    Total: {{ items.length }}
  </ul>
</div>

最佳答案

改变

 <li ng-repeat="item in items = (items | sortWithTab:tab)">

<li ng-repeat="item in filtered = (items | sortWithTab:tab)">

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

app.controller('SampleCtrl', ['$scope',
  function($scope) {

    $scope.tab = 'all';

    $scope.changeTab = function(tab) {
      $scope.tab = tab;
    }

    $scope.items = [{
      name: 'One',
      tab: 'live'
    }, {
      name: 'Two',
      tab: 'today'
    }, {
      name: 'Three',
      tab: 'today'
    }, {
      name: 'Four',
      tab: 'today'
    }, {
      name: 'Five',
      tab: 'live'
    }, {
      name: 'Six',
      tab: 'today'
    }, {
      name: 'Seven',
      tab: 'today'
    }, {
      name: 'Eight',
      tab: 'live'
    }];

  }
]);

app.filter('sortWithTab', function() {

  return function(list, tab) {

    var filtered;
    var i;

    if (tab == 'all') {

      return list;

    } else if (tab == 'today') {

      filtered = [];
      for (i = 0; i < list.length; i++) {
        if (list[i].tab == 'today')
          filtered.push(list[i]);
      }
      return filtered;

    } else if (tab == 'live') {

      filtered = [];
      for (i = 0; i < list.length; i++) {
        if (list[i].tab == 'live')
          filtered.push(list[i]);
      }
      return filtered;

    } else {

      return list;

    }
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app="App" ng-controller="SampleCtrl">

  <a ng-click="changeTab('all')">All</a> |
  <a ng-click="changeTab('today')">Today</a> |
  <a ng-click="changeTab('live')">Live</a> |
 

  <ul>
    <li ng-repeat="item in filtered = (items | sortWithTab:tab)">
      {{ item.name }}
    </li>
    
    <div ng-if="filtered.length === 0">No items</div>
    Total: {{ filtered.length }}
  </ul>
</div>

关于javascript - ng-repeat count - 过滤器更新次数不超过一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26108516/

相关文章:

php - 为什么点击标签<a>后,页面刷新并且appendTo不起作用?

javascript - 如何修改 Stumbleupon URL 并提供指向内容页面的直接链接?

javascript - Angular.js ng-repeat 按具有多个值之一的属性(或值)过滤

javascript - 在基于 Angularjs 的页面困境中识别元素/页面

javascript - jQuery if语句导致浏览器崩溃

javascript - AngularJS 通过 localhost 向 ExpressJS 发出请求

javascript - 如何使 Yii 框架的 CGridView 的 linkHtmlOptions 显示为图像图标,并在单击时触发 javascript/jquery?

javascript - AngularJS - 比较资源和对象

angularjs - $compile 与 $componentController

javascript - 来自不同 ng-repeat Angular js 的总和值