html - Angular ve Typescript'te select seçeneğiyle dizi
Bir sayfada ilgili cevaplarıyla birlikte 51 soru gösteriyorum. Her iki bilgi de tek bir web servisi çağrısından geliyor.
<tbody>
<tr *ngFor="let QuestionOption of questions; trackBy: trackQuestionById; let i = index;">
<th scope="row">{{QuestionOption.id}}</th>
<td>{{QuestionOption.name}} {{QuestionOption.description}}
</p>
<select class="form-control" name="selectAnswer" [(ngModel)]="answer[i]">
<option *ngFor="let answers of QuestionOption.Answers" [ngValue]="answers.id">{{answers.description}}</option>
</p>
</td>
</tr>
</tbody>
TypeScript kodunda aşağıdakileri deniyorum:
answer: Answer[];
this.answer = new Array<Answer>();
Answer türünün Id, Name, Score, Description gibi birden fazla alanı vardır
Çalışmayan şey, her zaman Id'yi answer[i]'ye almam gerektiği ama id'yi answer[i].id alanında olmasını istemem.
Eğer değiştirirsem
[(ngModel)]="answer[i]"
içine
[(ngModel)]="answer[i].id"
Aşağıdaki istisnayı alıyorum: HATA TypeError: "_co.caaAnswer[_v.context.index] tanımsız"
Ben de denedim:
[(ngModel)]="answer[i]?.id"
Yani answer[i] kullanmak doğru mu? Ve sonra seçeneklerde seçilen değeri answer[i].id'ye bir şekilde atamalı mıyım? Eğer öyleyse, bunu nasıl yapacağımı birisi yardımcı olabilir mi.
Her türlü yardım takdir edilir! Çok teşekkürler. augeres
Cevap #1
Çözümü buldum. Sorun, compareWith fonksiyonunun Array yüzünden düzgün çalışmamasıydı. Sadece html select'i array indeksine göre adlandırırsanız çalışır:
Çalışan versiyon:
<select class="form-control" id="field_answer{{i}}" name="field_answer{{i}}" [(ngModel)]="resultAnswer[i].answer" [compareWith]="compareFn">
<option [ngValue]="answer" *ngFor="let answer of Question.answers; trackBy: trackAnswerById">{{answer.id}} {{answer.description}}</option>
</select>
Cevap #2
Böyle bir seçim değişikliğinde cevaba yönelmek zorundasın
<select class="form-control" name="selectAnswer" [(ngModel)]="selectedAnswerId" (change)="setAnswer(i)">
<option *ngFor="let answers of QuestionOption.Answers" [ngValue]="answers.id">{{answers.description}}</option>
<select>
component.ts içinde
selectedAnswerId : number;
setAnswer(index){
this.answer[index].push({id : this.selectedAnswerId})
}
