Squ*_*ler 3 angularjs angularjs-ng-repeat
Angular仍然很新,只是找到我的方式.
我正在使用ng-repeat输出一个字母表的名称列表.我想在此列表中添加作为标签的分隔符.
例:
--------
A
--------
Author 1
Author 2
--------
B
--------
Author 3
Author 4
etc
Run Code Online (Sandbox Code Playgroud)
我的想法是使用嵌套的ng-repeats循环遍历字母表,通过第二个ng-repeat获取具有该特定字母的作者的对象.这是我到目前为止所拥有的:
<div data-ng-repeat="letter in alphabet">
<div class="item item-divider">
{{letter}}
</div>
<ul>
<li data-ng-repeat="speaker in GetSpeakers(letter)" type="item-text-wrap" href="#/speaker/{{speaker.ID}}">
{{speaker.title}}
</li>
</ul>
</div>
Run Code Online (Sandbox Code Playgroud)
控制器代码:
.controller('SpeakersCtrl', function($scope, $routeParams, StorageHandler) {
$scope.GetSpeakers = function(letter) {
// Get list of authors for that letter
console.log('test '+letter);
};
$scope.alphabet = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
})
Run Code Online (Sandbox Code Playgroud)
小提琴:http://jsfiddle.net/t6Xq8/
我有一些问题.
Xer*_*oid 12
我认为你可以用更简单的方式做到这一点,而不是:
ng-repeat通过使用$index.
所以看起来像这样:
<div ng-repeat="speaker in speakers | orderBy : 'name'">
<div class="item item-divider" ng-if="firstLetter(speaker.name) != firstLetter(speakers[$index-1].name)">
{{firstLetter(speaker.name)}}
</div>
{{speaker.name}}
</div>
Run Code Online (Sandbox Code Playgroud)
这需要一个简单的函数来获取第一个字母,例如:
function firstLetter(name) {
return name && name.charAt(0);
}
Run Code Online (Sandbox Code Playgroud)
所以它的作用是比较你传递给前一个对象的第一个字母的第一个字母,如果它们不同,则将该分隔符添加到该字母.很干净简单:)
看看这个工作JsFiddle
您可以明显改进该代码以处理大写/小写(即在比较之前始终大写)以及将比较提取到更清晰代码的函数中.
cha*_*tfl 11
将数据映射到对象键为字母的单个对象可能更好.我假设你有像这样的对象:
{id:123, firstName:'Frank',lastName :'Enstein'}
Run Code Online (Sandbox Code Playgroud)
并希望这封信代表姓氏
var tmp={};
for(i=0;i<authourArray.length;i++){
var letter=authourArray[i].lastName.charAt(0);
if( tmp[ letter] ==undefined){
tmp[ letter]=[]
}
tmp[ letter].push( authourArray[i] );
}
/* likely want to loop over all the arrays now and sort unless already sorted from server*/
$scope.repeaterObject=tmp;
Run Code Online (Sandbox Code Playgroud)
现在在标记ng-repeat中,对象键中的所有字母以及该循环内的所有字母都会为该字母执行ng-repeatauthors数组
<div data-ng-repeat="(letter, authors) in repeaterObject">
<div class="item item-divider">
{{letter}}
</div>
<ul>
<li ng-repeat="author in authors">{{author.firstName}} {{author.lastName}}</li>
</ul>
</div>
Run Code Online (Sandbox Code Playgroud)
生成的对象将如下所示:
{
A:[.....],
......
E:[ {id:123, firstName:'Frank',lastName :'Enstein'}, /* other E author objects*/ ],
......
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10761 次 |
| 最近记录: |