【问题标题】:Angular 6 default value of select is not getting selected in Reactive FormAngular 6 的默认值未在反应式表单中被选中
【发布时间】:2019-02-24 04:17:48
【问题描述】:

我有一个如下所示的表格。并且具有默认值的区域下拉列表是“ALL”,其他值是从 api 调用中填充的。

 <form method="POST" for enctype="multipart/form-data" [formGroup]="unitSearchForm">
            <div class="form-group">
              <label for="Zone">Zone</label>
              <select class="form-control" id="zone" formControlName="zoneId">
                <option [ngValue]="0">All</option>
                <option [ngValue]="zone.ZoneId" *ngFor="let zone of (_zones|async)?.Result">{{ zone.ZoneName}}</option>
              </select>
            </div>
            <div class="form-group">
              <input class="form-control" type="text" id="search" formControlName="unitName"
                placeholder="Search by Unit Name" />
            </div>
            <div class="form-group">
              <select class="form-control" formControlName="status">
                <option [ngValue]="status.Code" *ngFor="let status of _statusArr">{{status.Name}}</option>
              </select>
            </div>
            <div class="align-self-end form-group">
              <button type="submit" class="btn  btn-primary" (click)="SearchUnits()"><i
                  class="fa fa-fw fa-search"></i>Search</button>
            </div>
          </form>

/*
Component Code
*/

      ngOnInit() {
        this.InitilizeSearchForm();
        this.InitilizeSelectors();
      }


      private InitilizeSearchForm() {
        this.unitSearchForm = this._fb.group({
          zoneId: ['0'],
          unitName:['',Validators.maxLength(100)],
          status:['A']
        });
      }

      private InitilizeSelectors(){
        let searchCriteria: IDictionary = {}
        this._statusArr=this._dataservice.GetStatus();
        this._zones = this._adminService.Getzones(searchCriteria);
        searchCriteria["status"] =  this.unitSaveForm.get('status').value;
      }

如何在区域下拉菜单中选择“全部”?我在初始化表单时尝试设置该值。但它不起作用。总是第一个选择的值什么都不是。

【问题讨论】:

  • [ngValue]="value" 表示选项的值实际上是value,而不是转换为字符串的值。这是非常有用的行为,但这意味着表单中的初始值需要是数字 0 而不是字符串 '0',因为 '0' !== 0
  • @Vipin 是否有任何区域元素具有 ZoneId = 'All' ?还是需要动态添加?
  • @vadi,我已经有 html 选项“全部”。我不希望将其添加为 rxjs 请求的一部分。当我在表单字段中选择默认值= 0 分配。您可以在我的问题中看到 InitilizeSearchForm 方法。所以我选择 zoneId 为零。但它没有选择下拉菜单中的“全部”选项。
  • @Aluan Haddad 我试过你的建议,当我在 InitilizeSearchForm 中初始化表单时。试图设置 zoneid:0 。但它没有选择“全部”
  • 我很惊讶,这应该可行。也许这是一个时间问题。我只是推测,但我不明白您为什么延迟创建表单

标签: angular typescript angular-reactive-forms


【解决方案1】:

您可以将[value] 绑定用于选项,将[selected] 绑定用于All 选项:

<div class="form-group">
  <label for="Zone">Zone</label>
  <select class="form-control" id="zone" formControlName="zoneId">
    <option value="All" [selected]="'All'">All</option>
    <option [value]="zone.ZoneId" *ngFor="let zone of (_zones|async)?.Result">{{ zone.ZoneName}}
    </option>
  </select>
</div>

查看stackblitz

【讨论】:

  • ngValue和value有什么区别
  • @Vipin value 用于字符串,ngValue 可用于对象。在这种情况下两者都有效。
  • 是的,如果我使用 ngvalue 或 value,它对我有用。我现在有点困惑。我需要在单引号中传递选定的属性值吗
  • 好的,我知道了。选择的是属性绑定。所以如果我不使用单引号。它将寻找一个变量 all。谢谢
  • @Vipin 我已经在双引号内的单引号中指定了它,因为没有单引号的 [selected]="All" 意味着您在组件中的某个位置有一个名为 All 的变量。你也可以这样:在组件中:defaultOpts = 'All',然后在模板中 [selected]="defaultOpts"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-19
  • 1970-01-01
  • 2019-02-14
  • 2020-12-04
  • 2021-05-02
  • 2018-11-02
相关资源
最近更新 更多