Angular 如何使用Null作为角度材质选择的值
我希望有一个列表,其中一个列表项是“N/a”,如果选中,我希望formcontrol的值为null 在我的尝试中,我能够使formcontrol值的值为null,但是UI似乎没有保留所选的选项 TS:Angular 如何使用Null作为角度材质选择的值,angular,angular-material,angular-reactive-forms,Angular,Angular Material,Angular Reactive Forms,我希望有一个列表,其中一个列表项是“N/a”,如果选中,我希望formcontrol的值为null 在我的尝试中,我能够使formcontrol值的值为null,但是UI似乎没有保留所选的选项 TS: import { Component, SimpleChanges, OnChanges } from "@angular/core"; import { FormControl, FormGroup, FormBuilder } from "@angular/for
import { Component, SimpleChanges, OnChanges } from "@angular/core";
import { FormControl, FormGroup, FormBuilder } from "@angular/forms";
@Component({
selector: "my-app",
templateUrl: "./app.component.html",
styleUrls: ["./app.component.scss"]
})
export class AppComponent implements OnChanges {
mainForm: FormGroup;
constructor(private fb: FormBuilder) {
this.mainForm = this.fb.group({
selectedCountryControl: new FormControl("")
});
}
countries: any = [
{
full: "Great Britain",
short: "GB"
},
{
full: "United States",
short: "US"
},
{
full: "Canada",
short: "CA"
},
{
full: "N/A",
short: null
}
];
submit() {
console.log(this.mainForm.value);
}
}
<form [formGroup]="mainForm" style="margin-top: 30px;">
<mat-form-field>
<mat-select name="countryReactiveVaraible" formControlName="selectedCountryControl" placeholder="Country">
<mat-option *ngFor="let country of countries" [value]="country.short">
{{country.full}}
</mat-option>
</mat-select>
</mat-form-field>
<button class="btn btn-primary" mat-button (click)="submit()">
Save
</button>
</form>
<mat-form-field>
<mat-select #select="matSelect" name="countryReactiveVaraible" formControlName="selectedCountryControl"
placeholder="Country" [compareWith]="compareFn">
<mat-option *ngFor="let country of countries" [value]="country">
{{country.full}}
</mat-option>
</mat-select>
</mat-form-field>
HTML:
import { Component, SimpleChanges, OnChanges } from "@angular/core";
import { FormControl, FormGroup, FormBuilder } from "@angular/forms";
@Component({
selector: "my-app",
templateUrl: "./app.component.html",
styleUrls: ["./app.component.scss"]
})
export class AppComponent implements OnChanges {
mainForm: FormGroup;
constructor(private fb: FormBuilder) {
this.mainForm = this.fb.group({
selectedCountryControl: new FormControl("")
});
}
countries: any = [
{
full: "Great Britain",
short: "GB"
},
{
full: "United States",
short: "US"
},
{
full: "Canada",
short: "CA"
},
{
full: "N/A",
short: null
}
];
submit() {
console.log(this.mainForm.value);
}
}
<form [formGroup]="mainForm" style="margin-top: 30px;">
<mat-form-field>
<mat-select name="countryReactiveVaraible" formControlName="selectedCountryControl" placeholder="Country">
<mat-option *ngFor="let country of countries" [value]="country.short">
{{country.full}}
</mat-option>
</mat-select>
</mat-form-field>
<button class="btn btn-primary" mat-button (click)="submit()">
Save
</button>
</form>
<mat-form-field>
<mat-select #select="matSelect" name="countryReactiveVaraible" formControlName="selectedCountryControl"
placeholder="Country" [compareWith]="compareFn">
<mat-option *ngFor="let country of countries" [value]="country">
{{country.full}}
</mat-option>
</mat-select>
</mat-form-field>
{{country.full}
拯救
行为:
import { Component, SimpleChanges, OnChanges } from "@angular/core";
import { FormControl, FormGroup, FormBuilder } from "@angular/forms";
@Component({
selector: "my-app",
templateUrl: "./app.component.html",
styleUrls: ["./app.component.scss"]
})
export class AppComponent implements OnChanges {
mainForm: FormGroup;
constructor(private fb: FormBuilder) {
this.mainForm = this.fb.group({
selectedCountryControl: new FormControl("")
});
}
countries: any = [
{
full: "Great Britain",
short: "GB"
},
{
full: "United States",
short: "US"
},
{
full: "Canada",
short: "CA"
},
{
full: "N/A",
short: null
}
];
submit() {
console.log(this.mainForm.value);
}
}
<form [formGroup]="mainForm" style="margin-top: 30px;">
<mat-form-field>
<mat-select name="countryReactiveVaraible" formControlName="selectedCountryControl" placeholder="Country">
<mat-option *ngFor="let country of countries" [value]="country.short">
{{country.full}}
</mat-option>
</mat-select>
</mat-form-field>
<button class="btn btn-primary" mat-button (click)="submit()">
Save
</button>
</form>
<mat-form-field>
<mat-select #select="matSelect" name="countryReactiveVaraible" formControlName="selectedCountryControl"
placeholder="Country" [compareWith]="compareFn">
<mat-option *ngFor="let country of countries" [value]="country">
{{country.full}}
</mat-option>
</mat-select>
</mat-form-field>
正如你所看到的,我似乎无法使N/A“粘住”
Stackblitz链接:
import { Component, SimpleChanges, OnChanges } from "@angular/core";
import { FormControl, FormGroup, FormBuilder } from "@angular/forms";
@Component({
selector: "my-app",
templateUrl: "./app.component.html",
styleUrls: ["./app.component.scss"]
})
export class AppComponent implements OnChanges {
mainForm: FormGroup;
constructor(private fb: FormBuilder) {
this.mainForm = this.fb.group({
selectedCountryControl: new FormControl("")
});
}
countries: any = [
{
full: "Great Britain",
short: "GB"
},
{
full: "United States",
short: "US"
},
{
full: "Canada",
short: "CA"
},
{
full: "N/A",
short: null
}
];
submit() {
console.log(this.mainForm.value);
}
}
<form [formGroup]="mainForm" style="margin-top: 30px;">
<mat-form-field>
<mat-select name="countryReactiveVaraible" formControlName="selectedCountryControl" placeholder="Country">
<mat-option *ngFor="let country of countries" [value]="country.short">
{{country.full}}
</mat-option>
</mat-select>
</mat-form-field>
<button class="btn btn-primary" mat-button (click)="submit()">
Save
</button>
</form>
<mat-form-field>
<mat-select #select="matSelect" name="countryReactiveVaraible" formControlName="selectedCountryControl"
placeholder="Country" [compareWith]="compareFn">
<mat-option *ngFor="let country of countries" [value]="country">
{{country.full}}
</mat-option>
</mat-select>
</mat-form-field>
你可以这样做。 将
short
的值设置为如下字符串:short:“null”
,然后重试
将对象设置为mat的值输入选择如下内容:
试试这个:
import { Component, SimpleChanges, OnChanges } from "@angular/core";
import { FormControl, FormGroup, FormBuilder } from "@angular/forms";
@Component({
selector: "my-app",
templateUrl: "./app.component.html",
styleUrls: ["./app.component.scss"]
})
export class AppComponent implements OnChanges {
mainForm: FormGroup;
constructor(private fb: FormBuilder) {
this.mainForm = this.fb.group({
selectedCountryControl: new FormControl("")
});
}
countries: any = [
{
full: "Great Britain",
short: "GB"
},
{
full: "United States",
short: "US"
},
{
full: "Canada",
short: "CA"
},
{
full: "N/A",
short: null
}
];
submit() {
console.log(this.mainForm.value);
}
}
<form [formGroup]="mainForm" style="margin-top: 30px;">
<mat-form-field>
<mat-select name="countryReactiveVaraible" formControlName="selectedCountryControl" placeholder="Country">
<mat-option *ngFor="let country of countries" [value]="country.short">
{{country.full}}
</mat-option>
</mat-select>
</mat-form-field>
<button class="btn btn-primary" mat-button (click)="submit()">
Save
</button>
</form>
<mat-form-field>
<mat-select #select="matSelect" name="countryReactiveVaraible" formControlName="selectedCountryControl"
placeholder="Country" [compareWith]="compareFn">
<mat-option *ngFor="let country of countries" [value]="country">
{{country.full}}
</mat-option>
</mat-select>
</mat-form-field>
但是表单值也是一个字符串:{selectedCountryControl:“null”}
而不是{selectedCountryControl:null}
是的,我同意,但在其他对象中,值
也是字符串..每个问题我希望N/a映射到truenull
这是不可能的事,因为null意味着它实际上没有被选中<代码>{full:“N/A”,缩写:'}
-您必须至少设置空字符串。在这种情况下,他需要将对象设置为FormControl的值。mat select不应用==null
的值。在任何情况下,它都需要某种映射才能将该控件的“null”作为值获取。更好的方法是什么?使用空字符串而不是对象?这里没有更好的方法。如果他只需要将null
值发送到API,那么他可以记住Angular将执行JSON.stringify body,在这种情况下,他可以使用toJSON方法执行一些操作。您可以查看网络选项卡,注意我们将selectedCountryControl:null
传递到后端,是,'
或-1
值更容易理解谢谢@yurzui,你能解释一下,为什么常量NULL\u值虽然是对象,但返回NULL事件吗。