Angular 材质:在下拉列表中获取所选值的 id

Posted

技术标签:

【中文标题】Angular 材质:在下拉列表中获取所选值的 id【英文标题】:Angular material: get the id of the chosen value in a dropdown 【发布时间】:2019-02-19 02:56:15 【问题描述】:

我有一个从数据表上的编辑按钮打开的材料对话框。

我在“ressursId”上得到未定义,它应该从 patchValue 方法中获取它的值,但它也总是未定义。

同时调用pathcValue() 和使用 [displayWith]="displayFn" 似乎存在问题,因为 displayWith 会覆盖patchValue?我不知道。

所以这里不起作用的是,当我输入输入时,即使我在下拉列表中获得过滤结果,我也应该显示表中的初始值(如果存在,它并不总是存在时)对话框打开)。

更重要的是,我还需要获取所选值的ressursId,因为没有它,我无法发出 PUT 请求来更新数据。

我做错了什么? Angular 文档太简单了!

部分表单component.html

   <form class="mat-dialog-content" (ngSubmit)="submit()" #formControl="ngForm" [formGroup]="patchForm">

      <div class="form">
          <mat-form-field>
            <input
              matInput
              formControlName="selectedRessurs"
              [matAutocomplete]="auto"
              placeholder="Ressurs"
              [formControl]="ressursControl"
              >
            <mat-autocomplete #auto="matAutocomplete" name="selectedRessurs" [displayWith]="displayFn">
              <mat-option *ngFor="let option of filteredOptions | async" [value]="option">
                option.navn 
              </mat-option>
            </mat-autocomplete>
          </mat-form-field>
      </div>

还有我的component.ts

export class PatchDialogComponent implements OnInit 

  functiongGroup: FunksjonsGruppe;
  ressurs: Ressurser;

  @Input() prosjektFunksjon: ProsjektFunksjon;
  @Input() ressurser: Ressurser[];
  @Input() prosjFunk: ProsjektFunksjon[];

  // selectedFunksjon: any;
  selectedRessurs: number;
  selectedRessursId: number;
  ressursId: number;
  prosjektId: number;
  selectedRowId: any;
  funksjonsgruppe: any;
  fetchedProsjektFunksjon: ProsjektFunksjon;

  constructor(public dialogRef: MatDialogRef<PatchDialogComponent>,
              private projectService: ProjectService,
              @Inject(MAT_DIALOG_DATA) public data: any
              ) 
              

  formControl = new FormControl('', [
    // Validators.required
    // Validators.email,
  ]);
  ressursControl = new FormControl();
  // options: Ressurser[];
  filteredOptions: Observable<Ressurser[]>;

  patchForm = new FormGroup(
    selectedRessurs: new FormControl(),
    rollenavn: new FormControl(),
    estimertAntallTimer: new FormControl()
  );

  getErrorMessage() 
    return this.formControl.hasError('required') ? 'Required field' :
      this.formControl.hasError('email') ? 'Not a valid email' :
        '';
  

  submit() 
    // empty stuff
  

  onNoClick(): void 
    this.dialogRef.close();
  

  public confirmPut(): void 
    console.log(' 99: ', this.data);
    this.prosjektFunksjon = 
        prosjektFunksjonId: this.fetchedProsjektFunksjon.prosjektFunksjonId,
        estimertAntallTimer: this.patchForm.value['estimertAntallTimer'],
        rollenavn: this.patchForm.value['rollenavn'],
        funksjonId: null,
        funksjonNavn: null,
        subGruppe: null,
        subGruppeId: null,
        gruppe: null,
        gruppeId: null,
        ressursId: this.patchForm.value.selectedRessurs['ressursId'],
        ressursNavn: null
    ;
    console.log('data 101: ', this.data, '\n', ' ProsjektFunksjonsID: ', this.fetchedProsjektFunksjon.prosjektFunksjonId, '\n', ' prosjektFunksjon: ',  this.prosjektFunksjon, );
    this.projectService.updateProjectFunction(this.prosjektId, this.selectedRowId, this.prosjektFunksjon).subscribe();
  

  displayFn(user?: Ressurser): string | undefined 
    return user ? user.navn : '';
  

  private _filter(navn: string): Ressurser[] 
    const filterValue = navn.toLowerCase();
    return this.ressurser.filter(option => option.navn.toLowerCase().indexOf(filterValue) === 0);
    // return this.ressurser.filter(option => option.ressursId.indexOf(filterValue) === 0);
  

  ngOnInit(): void 
    this.data = this.dialogRef.componentInstance;
        this.projectService.getResources().subscribe(r => 
          this.ressurser = r;
          this.ressurser = (this.ressurser || []).sort((a: Ressurser, b: Ressurser) => a.navn.localeCompare(b.navn));
        );

    this.projectService.getProjectFunction(this.prosjektId, this.selectedRowId).subscribe(gpf => 
      // console.log('gpf:  ', gpf);
      this.fetchedProsjektFunksjon = gpf;
      console.log('onit: ', this.fetchedProsjektFunksjon);

      // patchFrom expects an object matching to the formgroup, field by field.
      this.patchForm.patchValue(
        selectedRessurs: this.fetchedProsjektFunksjon['ressursNavn'],
        rollenavn: this.fetchedProsjektFunksjon['rollenavn'],
        estimertAntallTimer: this.fetchedProsjektFunksjon['estimertAntallTimer']
       );
       console.log('After patchValue. fetchedProsjFunk: ', this.fetchedProsjektFunksjon);
    );

    this.filteredOptions = this.ressursControl.valueChanges
      .pipe(
        startWith<string | Ressurser>(''),
        map(value => typeof value === 'string' ? value : value.navn),
        map(navn => navn ? this._filter(navn) : null)
      );

     // @oninit


【问题讨论】:

【参考方案1】:

抱歉,我还没有足够的声誉来添加评论,但我注意到您在输入元素上设置了带有 formControlName="selectedRessurs" 的 [formGroup]="patchForm" 以及绑定到 [FormControl]="ressursControl"。我会假设其中只有一个是有效的,很可能是 ressursControl。至少这是需要检查的东西。

我还发现这些 SO 答案有助于理解 FormGroups 和 FormControls -> What is the difference between formControlName and FormControl?

希望这会有所帮助!

【讨论】:

是的,当我们使用来自父级的数据自动填充输入字段时,添加了 FormGroup,FormControl 已经存在,由同事添加,FormControlName 是获取 FormGroup 的必要部分去工作。我的问题是访问option 的其他属性,因为目前我们只能获取“名称”字段。在该对象中还有一个fooId,我们需要在打字稿文件中使用它,在发送到 API 的 PUT 请求的对象中引用。

以上是关于Angular 材质:在下拉列表中获取所选值的 id的主要内容,如果未能解决你的问题,请参考以下文章

从下拉列表中更新所选值的 mysql 记录

Angular-Kendo 在更改时自动完成所选值

无法从离子中的下拉列表中获取所选值

在视图中不预先选择具有所选值的MultiselectList

在c#MVC4中获取列表框中所选值的总和

MFC组合框控件下拉列表式如何读取所选值和设置默认选项