我是 ionic 和 Angular 的新手(或者就此而言,也是 JavaScript 的新手)。我正在尝试在我的消息传递应用程序中实现动态表单,用户将在其中回答服务器发送的民意调查。我的 HTML 和 TypeScript 片段如下。
initForm() {
// this.pollForm = this.formBuilder.group({
// question: '',
// options: '',
// polls: this.formBuilder.array([ this.createPoll() ])
// });
// let allPolls: FormArray = new FormArray([]);
// for (let i = 0; i < this.messageList.length; i++){
// let formGroup = new FormGroup({});
// if (this.messageList[i].isPoll){
// formGroup.addControl(String(this.messageList[i].messageId), new FormControl(false));
// allPolls.push(formGroup);
// }
this.pollForm = this.addNewPoll();
}
addNewPoll() {
let formGroup = new FormGroup({});
for (let i = 0; i < this.messageList.length; i++) {
if (this.messageList[i].isPoll) {
formGroup.addControl(String(this.messageList[i].messageId), new FormControl(true));
}
}
return formGroup;
}
doSubmit(msg: Message) {
// console.log(msg);
// console.log(this.messageList[this.messageList.length-1]);
// console.log(this.pollForm.get(String(msg.messageId)));
// console.log(this.pollForm.get(String(this.messageList[this.messageList.length-1].messageId)));
if (this.pollForm.get(String(msg.messageId)).touched) {
console.log('Submitting form', this.pollForm.get(String(msg.messageId)).value);
//this.pollAnswer = this.pollForm.value.options;
msg.poll.isAnswered = true;
}
}
<ion-content>
<div class="message-wrap">
<div *ngFor="let msg of messageList; let i = index"
class="message"
[class.left]="!(msg.fromUserId === currentUser.userId )"
[class.right]=" msg.fromUserId === currentUser.userId ">
<!-- <img class="user-img" [src]="msg.userAvatar" alt="" src="">
<ion-spinner name="dots" *ngIf="msg.status === 'pending'"></ion-spinner> -->
<div class="msg-detail">
<div class="msg-info">
<p>
{{msg.fromUserId}} {{msg.messageTime}}</p>
</div>
<div class="msg-content">
<span class="triangle"></span>
<p class="line-breaker" *ngIf="!(msg.isImage) && !(msg.isPoll)">{{msg.messageContent}}</p>
<img *ngIf='msg.isImage && !msg.isPoll' class="line-breaker" src="{{msg.imageBase64}}">
<div *ngIf="msg.isPoll && msg.poll.pollType=='single'">
<form [formGroup]="pollForm">
<ion-list radio-group [formControlName]='msg.messageId'>
<ion-list-header>
{{msg.poll.pollQuestion}}
<div *ngIf='msg.poll.isAnswered'>
<br> <br>
{{pollAnswer}}
</div>
</ion-list-header>
<ion-item *ngFor='let option of msg.poll.pollOptions'>
<ion-label>{{option}}</ion-label>
<ion-radio [disabled]='msg.poll.isAnswered'
checked="false" value={{option}}></ion-radio>
</ion-item>
<button [disabled]='msg.poll.isAnswered' ion-button
block clear (click)='doSubmit(msg)'>Submit</button>
</ion-list>
</form>
</div>
</div>
</div>
</div>
</div>
</ion-content>
messageList 正在通过我创建的模拟进行更新,如下所示
import { MOCK_POLLS } from "./polls.mock";
import { Message } from "./../models/message.interface";
export const MOCK_MESSAGE : Message[] = [
{
messageId: Date.now(),
messageContent: "Welcome to our app",
messageTime: Date.now(),
fromUserId: 4321,
toUserId: 1234,
isImage: false,
isPoll: false
},
{
messageId: Date.now()+10,
messageTime: Date.now(),
fromUserId: 4321,
toUserId: 1234,
isImage: false,
isPoll: true,
poll: MOCK_POLLS
},
{
messageId: Date.now()+11,
messageTime: Date.now(),
fromUserId: 4321,
toUserId: 1234,
isImage: false,
isPoll: true,
poll: MOCK_POLLS
},
]
import { Poll } from './../models/poll.interface';
const MOCK_POLL_OPTIONS : string[] = [
'Yes',
'No',
'No idea'
]
export const MOCK_POLLS : Poll = {
pollId: 123456789,
pollQuestion: "Do you like the current song?",
pollOptions: MOCK_POLL_OPTIONS,
isAnswered: false,
pollType: 'single'
}
我得到的输出如下: 输出图像1
这里的问题是,每当我按下任一表单的提交按钮时,即使只有一个满足 doSubmit() 方法中的“if”条件并且两个投票都得到 isAnswered 为 true,即使 console.log 两个表单都被提交在 doSubmit 中打印传递给 doSubmit 方法的 msg 的正确值。谁能指导我正确的方向?