javascript - Angular 5如何根据另一个下拉列表绑定下拉值
问题描述
我有一个从 api 填充的选择下拉列表,我希望能够根据用户的第一选择填充第二个选择下拉列表,然后根据用户的第二选择填充第二个下拉列表。说我有我的输入字段
form.component.html
<div class="form-group col-sm-6">
<label> Category</label>
<select class="form-control" [(ngModel)]="product.productCategory" [formControl]="productForm.controls['productCategory']" require>
<option *ngFor="let item of categorys" [value]="item.slug">{{item.name}}</option>
</select>
</div>
<div class="form-group col-sm-6">
<label> Product Type</label>
<select class="form-control" [(ngModel)]="product.productType" [formControl]="productForm.controls['productType']" require>
<option *ngFor="let item of productTypes" [value]="item.slug">{{item.name}}</option>
</select>
</div>
<div class="form-group col-md-6">
<label>Sub-Category</label>
<select class="form-control" [(ngModel)]="product.subCategory" [formControl]="productForm.controls['subCategory']" require>
<option *ngFor="let item of subs" [value]="item.slug">{{item.name}}</option>
</select>
</div>
因为我将整个列表绑定到每个单独的选择下拉列表,但我希望 subCategory 仅是所选类别下的那些,并且与基于所选 subCategory 的 productType 相同。这就是我检索类别的方式,因为它是父选择
form.component.ts
fetchCategorys() {
this.categorySrv.fetchCategories().then((response: any) => {
this.categorys = response;
console.log(this.categorys);
})
.catch(error => this.error = error)
}
我使用相同的方法分别获取 subCategory 和 productType。如您所见,它从 db 中带来了每个部分中的所有项目,但我希望能够根据类别的选择绑定 subCategory,并根据 subCategory 的选择绑定 productType。请注意,console.log(this.categorys)
显示类别及其各自的 subCategory 和 productType 但我不知道如何使绑定对应。
解决方案
模板
<div class="form-group col-sm-6">
<label> Category</label>
<select class="form-control" (change)="categoryChange($event)" [(ngModel)]="product.productCategory" [formControl]="productForm.controls['productCategory']" require>
<option *ngFor="let item of categorys" [value]="item.slug">{{item.name}}</option>
</select>
</div>
<div class="form-group col-sm-6">
<label> Product Type</label>
<select class="form-control" (change)="productTypeChanged($event)" [(ngModel)]="product.productType" [formControl]="productForm.controls['productType']" require>
<option *ngFor="let item of productTypes" [value]="item.slug">{{item.name}}</option>
</select>
</div>
<div class="form-group col-md-6">
<label>Sub-Category</label>
<select class="form-control" [(ngModel)]="product.subCategory" [formControl]="productForm.controls['subCategory']" require>
<option *ngFor="let item of subs" [value]="item.slug">{{item.name}}</option>
</select>
</div>
零件
public allProductTypes: ProductType[];
public allSubs: Category[];
public categoryChange( $event: Category ) {
this.productTypes = this.allProductTypes.filter( _productType => _productType.belongsTo( $event));
}
public productTypeChanged( $event: ProductType ) {
this.subs = this.allSubs.filter( _sub => _sub.belongsTo( $event ) );
}
因此,您将您的绑定到下拉更改事件。然后,每次选择类别或产品类型时,我们都会过滤下拉菜单可显示的数据。
您可能还必须重置下游选择,也就是。更改类别时,请重置产品类型和子类别,因为新的顶级类别可能不允许旧的类型和子类别值存在。
推荐阅读
- azure - 列出提供者资源类型的可用子资源
- asp.net-core - IE11 的 Vuetify/Lib Polyfilling 不起作用 - SCRIPT1002:语法错误
- r - 如何在闪亮的R中显示反应数据框中的最后一个日期条目
- javascript - 如何使用一个按钮来改变其他按钮的样式?
- ios - iOS 13:UIScrollView 不再滚动
- r - 如何用锯齿形或斜线填充 ggplot geom_map 中的 NA 值?
- sharepoint - 从 SharePoint 下载 MS Graph API 文件
- python - Python blackjack:如何构造一个 if 语句来确定 Ace 是否应该变成 1?
- mysql - 使用连接 MySQL 时字段列表中的未知列
- ios - -[RCTRootView cancelTouches]` 已弃用,将很快在反应原生地图中删除