Рабочая демонстрация в этом StackBlitz Link
вам необходимо проверить раздел и длину каждого раздела .. так, чтобы вы достигли конца или начала изменения раздела Обход раздела в это время и изменение индекса в соответствии с этим.
navigateUsingKey(event) {
switch (event.keyCode) {
case 38: // this is the ascii of arrow up
this.linkIndex === -1 ? this.linkIndex = 0 : this.linkIndex-- ;
// each section traversal...
if(this.currentSectionIndex === 0){
this.downTraverse(2,this.list3.length);
} else if(this.currentSectionIndex === 2){
this.downTraverse(1, this.list2.length);
} else if(this.currentSectionIndex === 1){
this.downTraverse(0, this.list1.length)
}
break;
case 40: // this is the ascii of arrow down
if(this.currentSectionIndex === 0){
this.upTraverse(1, this.list1.length);
} else if(this.currentSectionIndex === 1){
this.upTraverse(2, this.list2.length);
} else if(this.currentSectionIndex === 2){
this.upTraverse(0, this.list3.length);
}
this.linkIndex++;
break;
}
}
downTraverse(sectionIndex:number, listLength){
// calls when DOWN key press...
this.linkIndex === -1 ? (this.currentSectionIndex = sectionIndex, this.linkIndex = listLength - 1) : '';
}
upTraverse(sectionIndex: number, listLength: number){
// calls when UP key press...
listLength-1 <= this.linkIndex ? (this.currentSectionIndex = sectionIndex, this.linkIndex = -1) : '';
}
Файл шаблона
<input (keyup)="navigateUsingKey($event)"/>
<hr>
<h5> You are in : {{currentSectionIndex}} section
<hr>
<div>
<h4 [ngClass]="{'section-color' : currentSectionIndex === 0}">Fruit </h4>
<ul>
<li *ngFor="let item of list1; let i = index;" [class.activeSearchLink]="i === linkIndex && currentSectionIndex === 0"> {{item.name}}
</li>
</ul>
<h4 [ngClass]="{'section-color' : currentSectionIndex === 1}">Vegie</h4>
<ul>
<li *ngFor="let item of list2; let i = index;" [class.activeSearchLink]="i === linkIndex && currentSectionIndex === 1"> {{item.name}}
</li>
</ul>
<h4 [ngClass]="{'section-color' : currentSectionIndex === 2}">Phone</h4>
<ul>
<li *ngFor="let item of list3; let i = index;" [class.activeSearchLink]="i === linkIndex && currentSectionIndex === 2"> {{item.name}}
</li>
</ul>
</div>