【问题标题】:Why are my ng-repeat items not filtering as expected here?为什么我的 ng-repeat 项目没有按预期过滤?
【发布时间】:2015-08-30 16:55:03
【问题描述】:

Plnkr: http://plnkr.co/edit/Q34J9szbLeGgc4jkcNUM?p=preview

我有一个名为 tags 的简单数组,其中包含 4 个具有 tweets 值和 vol 值的对象。

当我点击 Order by TweetsOrder by Vol 按钮时,我希望这些数字有意义,例如从高到低或从低到高,但是数字乱了。

标记:

 <div class="sidebar" ng-controller="sidebar">
  <header class="my-header">
    <button ng-click="reOrderByTweets()">Order by Tweets</button>
    <button ng-click="reOrderByVol()">Order by Vol</button>
  </header>
  <ul>
    <li ng-repeat="t in tags" ng-mouseleave="leaveTag(t)">
      <div class="tag-container">
        <div class="tag border1"
             ng-mouseover="showTagDetails(t)">{{t.name}} | tweets: {{t.tweets}} | vol: {{t.vol}}</div>
        <tag-details tag="t"></tag-details>
      </div>
    </li>
  </ul>
</div>

JavaScript:

$scope.tags.push(
  {
    name: 'Item 1 ', 
    tweets: '412',
    vol: '50'
  },
  {
    name: 'Item 2 ', 
    tweets: '10',
    vol: '500'
  },
  {
    name: 'Item 3 ', 
    tweets: '67',
    vol: '5'
  },
  {
    name: 'Item 4 ', 
    tweets: '0',
    vol: '30'
  }
);

功能:

function reOrderByTweets() {
    console.log('reOrderByTweets');
    vs.orderReverse = !vs.orderReverse;
    $scope.tags = $filter('orderBy')($scope.tags, 'tweets', vs.orderReverse);
    console.log('vs.orderReverse = ', vs.orderReverse); // true or false
    console.log('$scope.tags = ', $scope.tags);
}

function reOrderByVol() {
    console.log('reOrderByVol');
    vs.orderReverse = !vs.orderReverse;
    $scope.tags = $filter('orderBy')($scope.tags, 'vol', vs.orderReverse);
    console.log('vs.orderReverse = ', vs.orderReverse); // true or false
    console.log('$scope.tags = ', $scope.tags);
}

正如您在下面的屏幕截图中看到的那样,按 Vol 排序。带有vol:5 的项目应该排在vol:30 之后


更新:看起来它只过滤数字中的第一个数字?为什么不取整个数字?

按点击一次的推文过滤:

按第二次点击的推文过滤:

【问题讨论】:

  • 请显示模板
  • @sjt003 标记添加,我故意不想在标记中有 orderBy
  • @LeonGaban 您按文本值排序。 Vol 是文本值而不是数字。所以它按字母顺序排列。
  • @Phill 你是对的!叹息,想发布答案.. 或者我应该删除它,因为它是语法错误,或者更确切地说是类型错误。
  • 另外做 angular.element($0).scope 看看你的 $scope.tags 是否真的在改变——最好在一个对象中引用它。

标签: javascript arrays angularjs angularjs-ng-repeat angularjs-filter


【解决方案1】:

您按字母顺序完成的字符串值排序。

'10' '5' '30'

这个的字符串顺序是10 / 30 / 5。

将“vol”和“tweets”更改为数字:

  $scope.tags.push(
    {
      name: 'Item 1 ', 
      tweets: 412,
      vol: 50
    },
    {
      name: 'Item 2 ', 
      tweets: 10,
      vol: 216
    },
    {
      name: 'Item 3 ', 
      tweets: 67,
      vol: 15
    },
    {
      name: 'Item 4 ', 
      tweets: 0,
      vol: 30
    }
  );

正确排序您的推文。

【讨论】:

  • 为了完整起见,如果数据是字符串并且无法更改。您还可以将getter 函数添加到$filter 服务并使用parseInt(tag.tweets) 将推文字符串转换为整数。请参阅此示例plunkr
猜你喜欢
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多