如何在 Angular 7 响应式表单中设置 HTML Select Element 的选定值?

Posted

技术标签:

【中文标题】如何在 Angular 7 响应式表单中设置 HTML Select Element 的选定值?【英文标题】:How to set selected value of HTML Select Element in Angular 7 reactive forms? 【发布时间】:2019-06-21 19:29:31 【问题描述】:

我在我的组件中使用Angular 7 reactive forms。我的组件的一部分:

@Component(
  selector: 'my-form',
  templateUrl: './my-form.component.html',
  styleUrls: ['./my-form.component.scss']
)
export class MyFormComponent implements OnInit 
  form: FormGroup;
  loaded: boolean = false;
  item: Item;
  // item gets loaded from the server and looks like this:
  // 
  //   id: 'dksldfkfjdk',
  //   title: 'first',
  //   selected: 'basic'
  // 
  itemsForSelect = ['basic', 'primary', 'admin'];
  isNew: boolean = false;

  constructor(private route: ActivatedRoute,
    private resourceService: ResourceService,
    private fb: FormBuilder,
    private router: Router) 
  

  ngOnInit() 

    this.resourceService.getItem().subscribe(res => 

      if (res.success) 
        this.item = res.item;
        this.createForm();
        this.loaded = true;
      
    );
  

  createForm() 
    this.form = this.fb.group(
      'title': [this.item.title, Validators.compose([])],
      'selected': [this.item.selected, Validators.compose([])]
    );
  

部分组件HTML模板相关form:

<form [formGroup]="form" (ngSubmit)="isNew ? create() : update()" [class.error]="!form.valid && form.touched">
  <div class="form-group">
    <label for="item"></label>
    <select placeholder="Choose Select" [formControl]="form.controls.selected" class="form-control"
      id="item">
      <option *ngFor="let itemForSelect of itemsForSelect"> itemForSelect </option>
    </select>
  </div>
  <button class="btn btn-primary udpate pointer" [disabled]="!form.valid" type="submit">
     isNew ? 'Create' : 'Update' 
  </button>
</form>

问题在于,在使用例如admin 值更新item 后,它在属性selected 中具有来自服务器的此值,但在获取数据和显示形式。如何在 Angular 7 中设置选中?我知道我可以使用[(ngModel)] = item.selected,但是当我使用form.controls 时,我会在控制台中收到警告。

【问题讨论】:

【参考方案1】:

您可以像这样在表单控件上使用 patchValue:

public updateValue() 
this.form.get('selected').patchValue('basic');

改进:不要在同一个表单控件中使用 formControl 和 formControlName。这是更深层次的链接explanation

【讨论】:

还是不行。问题出在select HTML element 上。对于其他元素(输入),一切正常。表单在加载项目后创建。虽然项目已选择属性admin,但HTML select element 的选定值是basic Dont use formControl with formControlName - 谢谢,我已经更正了那部分【参考方案2】:

您需要在选项中添加 [value] 属性

 <option
        [value]="itemForSelect"
        *ngFor="let itemForSelect of itemsForSelect"
  > itemForSelect </option>

沙盒:https://codesandbox.io/s/angular-l0d09

【讨论】:

以上是关于如何在 Angular 7 响应式表单中设置 HTML Select Element 的选定值?的主要内容,如果未能解决你的问题,请参考以下文章

在 Angular 7 中处理大型响应式表单

如何在反应式表单中设置模型数据,Angular 9

如何使用响应式表单将验证器添加到表单控件以从角度材料进行匹配输入

Angular Reactive Forms,patchValue 不起作用,嵌套表单

如何在 Angular/Ionic 框架中设置离子输入的样式?

如何在登录表单上的drupal 7中设置占位符