Angular - *ngFor:从 ts 文件中的索引传递 i
Angular - *ngFor: Passing i from index in ts file
我试图将索引从 ngFor 传递到我的 ts 文件,但没有成功。我实际上不知道该怎么做。
有人能告诉我如何将索引值从 html 传递到 ts 文件吗?
我认为使用 @Input 将是解决方案,但没有任何反应......
谢谢
我的HTML:
<div *ngFor="let question of questions | async; index as i">{{question.libelle}}
<div class="row text-left options">
<div class="col-md-6" *ngFor="let reponse of reponses | async">
<div class="option">
<label class="" [attr.for]="reponse.id">
<input type="checkbox" [(ngModel)]="reponse.Selected"/>
{{reponse.libelle}}
</label>
</div>
</div>
</div>
{{i}}
</div>
我的TS:
@Injectable()
@Component({
selector: 'app-java',
templateUrl: './java.component.html',
styleUrls: ['./java.component.sass']
})
export class JavaComponent implements OnInit {
@Input() i : any;
questions :any = [];
reponses :any = [];
constructor(private questionnaireService: QuestionnaireService) { }
ngOnInit() {
this.questions = this.questionnaireService.getQuestion();
this.reponses = this.questionnaireService.getReponse(this.i);
}
}
您可以通过 3 个步骤实现这些
Keep the currentIndex in ts file
Set the currentIndex from the html
Call getter method from the *ngFor
在 ts
@Injectable()
@Component({
selector: 'app-java',
templateUrl: './java.component.html',
styleUrls: ['./java.component.sass']
})
export class JavaComponent implements OnInit {
@Input() i : any;
questions :any = [];
reponses :any = [];
constructor(private questionnaireService: QuestionnaireService) { }
ngOnInit() {
this.questions = this.questionnaireService.getQuestion();
}
//Track the current Index
public currentIndex;
//Current Index Setter
setCurrentIndex(index){
this.currentIndex = index;
}
//Getter for response which will use currentIndex
get responses(){
return this.questionnaireService.getReponses(this.currentIndex)
}
}
在html
<div *ngFor="let question of questions | async; index as i">{{question.libelle}}
<div class="row text-left options" #>
{{setCurrentIndex(i)}} <-- Set the current Index -->
<div class="col-md-6" *ngFor="let reponse of responses | async">
<div class="option">
<label class="" [attr.for]="reponse.id">
<input type="checkbox" [(ngModel)]="reponse.Selected"/>
{{reponse.libelle}}
</label>
</div>
</div>
</div>
{{i}}
</div>
Note : since you are using async pipe make sure all your results are Observable.
您似乎对索引变量上下文以及可观察对象的工作方式有基本的误解。将您的组件分成两个组件,一个用于管理和显示整个列表,另一个用于管理和显示 child 列表
parent (app-java):
HTML:
<div *ngFor="let question of questions | async; index as i">{{question.libelle}}
<div class="row text-left options">
<app-java-child [i]="i"></app-java-child>
</div>
{{i}}
</div>
TS:
@Component({
selector: 'app-java',
templateUrl: './java.component.html',
styleUrls: ['./java.component.sass']
})
export class JavaComponent implements OnInit {
questions :any = [];
constructor(private questionnaireService: QuestionnaireService) { }
ngOnInit() {
this.questions = this.questionnaireService.getQuestion();
}
}
和 child:
HTML:
<div class="col-md-6" *ngFor="let reponse of reponses | async">
<div class="option">
<label class="" [attr.for]="reponse.id">
<input type="checkbox" [(ngModel)]="reponse.Selected"/>
{{reponse.libelle}}
</label>
</div>
</div>
TS:
@Component({
selector: 'app-java-child',
templateUrl: './java-child.component.html',
styleUrls: ['./java-child.component.sass']
})
export class JavaChildComponent implements OnInit {
@Input() i : any;
reponses :any = [];
constructor(private questionnaireService: QuestionnaireService) { }
ngOnInit() {
this.reponses = this.questionnaireService.getReponse(this.i);
}
}
通过这种方式,您可以从初始 ngFor 获取索引并将其作为输入提供给 child,这样 children 就可以负责构建自己的响应数组。
通常
足以通过 ii,但是,在我的情况下, sub 中有一个 *ngIf,所以一团糟计数并使其未定义。我最终将 *ngIf 置于 *ngFor 之上的顶层。
我试图将索引从 ngFor 传递到我的 ts 文件,但没有成功。我实际上不知道该怎么做。 有人能告诉我如何将索引值从 html 传递到 ts 文件吗? 我认为使用 @Input 将是解决方案,但没有任何反应...... 谢谢
我的HTML:
<div *ngFor="let question of questions | async; index as i">{{question.libelle}}
<div class="row text-left options">
<div class="col-md-6" *ngFor="let reponse of reponses | async">
<div class="option">
<label class="" [attr.for]="reponse.id">
<input type="checkbox" [(ngModel)]="reponse.Selected"/>
{{reponse.libelle}}
</label>
</div>
</div>
</div>
{{i}}
</div>
我的TS:
@Injectable()
@Component({
selector: 'app-java',
templateUrl: './java.component.html',
styleUrls: ['./java.component.sass']
})
export class JavaComponent implements OnInit {
@Input() i : any;
questions :any = [];
reponses :any = [];
constructor(private questionnaireService: QuestionnaireService) { }
ngOnInit() {
this.questions = this.questionnaireService.getQuestion();
this.reponses = this.questionnaireService.getReponse(this.i);
}
}
您可以通过 3 个步骤实现这些
Keep the currentIndex in ts file
Set the currentIndex from the html
Call getter method from the *ngFor
在 ts
@Injectable()
@Component({
selector: 'app-java',
templateUrl: './java.component.html',
styleUrls: ['./java.component.sass']
})
export class JavaComponent implements OnInit {
@Input() i : any;
questions :any = [];
reponses :any = [];
constructor(private questionnaireService: QuestionnaireService) { }
ngOnInit() {
this.questions = this.questionnaireService.getQuestion();
}
//Track the current Index
public currentIndex;
//Current Index Setter
setCurrentIndex(index){
this.currentIndex = index;
}
//Getter for response which will use currentIndex
get responses(){
return this.questionnaireService.getReponses(this.currentIndex)
}
}
在html
<div *ngFor="let question of questions | async; index as i">{{question.libelle}}
<div class="row text-left options" #>
{{setCurrentIndex(i)}} <-- Set the current Index -->
<div class="col-md-6" *ngFor="let reponse of responses | async">
<div class="option">
<label class="" [attr.for]="reponse.id">
<input type="checkbox" [(ngModel)]="reponse.Selected"/>
{{reponse.libelle}}
</label>
</div>
</div>
</div>
{{i}}
</div>
Note : since you are using async pipe make sure all your results are Observable.
您似乎对索引变量上下文以及可观察对象的工作方式有基本的误解。将您的组件分成两个组件,一个用于管理和显示整个列表,另一个用于管理和显示 child 列表
parent (app-java):
HTML:
<div *ngFor="let question of questions | async; index as i">{{question.libelle}}
<div class="row text-left options">
<app-java-child [i]="i"></app-java-child>
</div>
{{i}}
</div>
TS:
@Component({
selector: 'app-java',
templateUrl: './java.component.html',
styleUrls: ['./java.component.sass']
})
export class JavaComponent implements OnInit {
questions :any = [];
constructor(private questionnaireService: QuestionnaireService) { }
ngOnInit() {
this.questions = this.questionnaireService.getQuestion();
}
}
和 child:
HTML:
<div class="col-md-6" *ngFor="let reponse of reponses | async">
<div class="option">
<label class="" [attr.for]="reponse.id">
<input type="checkbox" [(ngModel)]="reponse.Selected"/>
{{reponse.libelle}}
</label>
</div>
</div>
TS:
@Component({
selector: 'app-java-child',
templateUrl: './java-child.component.html',
styleUrls: ['./java-child.component.sass']
})
export class JavaChildComponent implements OnInit {
@Input() i : any;
reponses :any = [];
constructor(private questionnaireService: QuestionnaireService) { }
ngOnInit() {
this.reponses = this.questionnaireService.getReponse(this.i);
}
}
通过这种方式,您可以从初始 ngFor 获取索引并将其作为输入提供给 child,这样 children 就可以负责构建自己的响应数组。
通常
足以通过 ii,但是,在我的情况下, sub 中有一个 *ngIf,所以一团糟计数并使其未定义。我最终将 *ngIf 置于 *ngFor 之上的顶层。