typescript 选择值时,数据列表输入出现[object对象]-Angular

j8ag8udp  于 2023-04-13  发布在  TypeScript
关注(0)|答案(1)|浏览(146)

我有我的表格的这一部分:

<div formArrayName="studentPublishing" *ngFor="let all of getstudentPublishing().controls;  index as i">
    <div class="form-group data">
        <input type="text" list="options" class="form-control" placeholder="Students" (change)="getAuthor($event,i)" [formControlName]="i" required>

        <datalist id="options">
        <option *ngFor="let c of dataStudent" [value]="c.name">{{ c.name }}</option>
        </datalist>

        <div class="rem"><button (click)="removeAuthor(i)">-</button></div>

        <div *ngIf="!formPublic.get('studentPublishing')?.valid && formPublic.get('studentPublishing')?.touched" class="validation-error">
            <p>Authors are mandatory</p>
        </div>

    </div>
</div>
<div id="add" class="add"><button type="button" (click)="addAuthor()">Author +</button></div>

一切都正常工作。值是Student对象,它已经包含了数据库中的数据。这里的问题是,当我在输入中选择Student时,它显示[object Object]。
这是我在Typescript中的函数,它从数据列表中获取值并将其写入以下形式的student数组变量:

getAuthor(e: any, id:number){
    const studentName = e.target.value;
    const studentSelected = this.dataStudent.find(x => x.name === studentName);
    if (studentSelected) {
      this.getstudentPublishing().at(id).setValue(studentSelected);
    }
}

我使用ngValue并尝试使用json管道转换值:

<option *ngFor="let c of dataStudent" [ngValue]="c">{{ c.name | json }}</option>

我尝试将值作为字符串与所选对象的名称一起传递:

<option *ngFor="let c of dataStudent" value="{{ c.name }}"></option>

但是当我在变量中保存值时,只保存名称,我需要整个对象。
以下是选择学生时输入的外观:
input datalist image with [object Object]
这是我希望它看起来如何确定哪个学生被选中:
input datalist image with selected student's name

lhcgjxsq

lhcgjxsq1#

问题是,您让FormControl尝试执行双重任务-值应该是字符串名称还是Student对象?以下只是您可以尝试的几种策略之一。

使FormControl元素存储字符串值

在这种情况下,每个控件的类型都是 FormControl。在该控件上,您可能已经有了一个Required Validator,但请继续添加现有的学生姓名验证器。它可能看起来像这样:

export function existingStudentValidator(students: Student[]): ValidatorFn {
  return (control: AbstractControl): ValidationErrors | null => {
    const isExisting = students.some(x => x.name === control.value);
    return !isExisting ? { existingStudent: {value: control.value} } : null;
  };
}

现在,当您需要FormArray值作为Student对象的数组时,您所要做的就是检查表单是否处于 valid 状态,并使用 * Array.map()* 转换该值。

this.form.updateValueAndValidity(); // make sure form validity is up to date.
if (this.form.valid) {
  const students = this.form.studentPublishing.map(x => 
    this.dataStudent.find(y => y.name === x.name)!); // trust that name isn't null.
  /* ... do something with students ... */
}

还有很多其他的考虑因素,比如名字匹配是否不区分大小写,或者如果多个学生有相同的名字会发生什么,但这应该让你开始。

相关问题