【问题标题】:Getting the last ng-repeat item after it has been orderBy'd在 orderBy'd 后获取最后一个 ng-repeat 项目
【发布时间】:2015-03-06 23:08:33
【问题描述】:

我正在尝试生成一个术语列表及其定义,但在每个字母部分的开头放置一个标题。浏览器

一个

苹果

B

香蕉

为此,我有以下代码:

<div ng-repeat="definition in definitions">
   <div ng-if="firstLetterOfTerm(definitions[$index])!=firstLetterOfTerm(definitions[$index-1])">
      <h1>{{firstLetterOfTerm(definitions[$index])}}<hr></h1>
   </div>
   <div>{{definition.term}}</div>
</div>

如果订购了definitions,这将非常有用。但如果不是,这不起作用。 IE考虑列表

["Banana", "Apple"]

根据我目前的逻辑,这将产生以下列表:

一个

香蕉

B

苹果

那是因为当我执行firstLetterOfTerm(definitions[$index]) 时,$index 指向原始的无序列表。有什么办法可以让它正确定位$index?或者也许是一种不同的方式来构建这个产生相同结果的解决方案

注意:我不想预先对列表进行预排序,因为它可能非常大。

【问题讨论】:

  • 为什么不使用sort() 来确保元素始终按照您想要的方式排序?
  • @kidA 如果你能读到我的问题的结尾,你会发现。
  • 无论您是为了方便而预先对它进行排序,还是让ng-repeat 为您排序,您的应用程序仍在以某种方式对其进行排序,因此它是否“相当大”并不重要。”
  • @rgthree 如果我只是按照给定的顺序拿它,它就不会排序。
  • 我读过它,但我不明白如果它很大有什么不同。

标签: javascript html angularjs angularjs-ng-repeat angularjs-orderby


【解决方案1】:

您是否希望您的数组中每个字母只包含一个实例?如果定义包含 [apple,banana,avocado] 它不会打印数组中每个字符串的第一个字母: 一种 苹果 b 香蕉 一种 鳄梨。

第一个 firstLetterOfTerm(definitions[$index-1]) 也不会返回 undefined 因为索引 0 - 1 不存在? Codepen `

<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js"></script>
<script type="text/javascript">
angular.module('myStatefulFilterApp', [])
 .controller('personController', ['$scope', function($scope) {

    $scope.definitions = ['apple0', 'banana0','apple1', 'banana1','apple2', 'banana2','apple3', 'banana3']

}])
.filter('startsWith', [function(){
  var start = function(array, letter){
    console.log(arguments)
    var newArray = new Array();
    angular.forEach(array, function(x){
      if (letter == x.charAt(0)) newArray.push(x)
    })
                    return newArray;
  }
  return start;
}])


 .filter('titleCaseFilter', [ function() {  
        var titleCaseFilter = function(array) {

        var newArray = new Array();
            angular.forEach(array, function(string){
            if (newArray.indexOf(string.charAt(0)) == -1)       newArray.push(string.charAt(0));
      });
  return newArray;
}
return titleCaseFilter;
}])



</script>
<div ng-app="myStatefulFilterApp" ng-controller="personController">

<div ng-repeat="definition in definitions | titleCaseFilter">
  <div>{{definition}}</div>
  <div ng-repeat="def in definitions | startsWith:definition">
    {{def}}
  </div>
</div>
</div>

`

【讨论】:

  • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post
  • 最初我确实相信我出于某种原因留下了评论,它成为了一个答案......最初的问题要求以不同的方式来“构建解决方案”,指向 codpen 的链接就是这样。
猜你喜欢
  • 2016-11-12
  • 1970-01-01
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多