Material 2 表单控件 Select 无法使用异步源
Material 2 Form Control Select Not working with Async Source
我是 运行 Angular 4.3.4 和 Material 2.0.0-beta.12,我在尝试创建 mat-select 以生成动态时遇到问题来自异步源的垫选项列表。我得到的只是占位符,下拉列表不会展开。我什至没有收到错误代码。
这是我的代码示例 已更新:
<form [formGroup]="snoozeForm" novalidate>
<div fxLayout="column">
<mat-form-field>
<mat-select formControlName="snooze_reason">
<mat-option [value]="reason.attributes.snooze_reason_code" *ngFor="let reason of reasons">{{ reason }}</mat-option>
</mat-select>
</mat-form-field>
</form>
如您所见,reasons 是动态填充的数组。我一定是忽略了一些简单的事情,但我确信 原因 正在填充。
这是我填充数组的位置:
ngOnInit() {
this.generateForm();
this.httpService.getSnoozeReasons()
.subscribe( res => {
this.reasons = res;
}, (error: any) => {
const msg: Message = { title: 'Frontend API Error', textbody1: '' };
if (error.message) {
msg.textbody1 = <any>error.message;
msg.textbody2 = `Task-details component - Snooze reasons`;
} else {
msg.textbody1 = `HTTP ${error.status}: ${error.statusText}`;
msg.textbody2 = `Task-details - Snooze reasons: ${error.url}`;
}
this.messageService.createMessage(msg);
})
;
}
generateForm(): void {
this.snoozeForm = this.fb.group({
snooze_reason: ['', [Validators.required]],
snooze_hour: ['', [Validators.pattern('[0-9]*'), Validators.max(72)]],
snooze_minute: ['', [Validators.required, Validators.min(5), Validators.pattern('[0-9]*')]]
});
}
有人遇到过异步数据和 Select 表单控件的问题吗?
我认为问题不是异步数组的原因,否则明智的做法是当您使用 formControlName="snooze_reason" 时,如果您尝试删除 formcontrolname,"select" 工作正常。发生这种情况是因为 Angular 表单中的控件需要声明为表单组的子项。
import {Component} from '@angular/core';
import {FormControl, FormGroup} from '@angular/forms';
@Component({
selector: 'material-select-angular',
templateUrl: 'material-select-angular.html',
})
export class MaterialSelectAngular implements OnInit {
formParent = new FormGroup({
snoozeReason: new FormControl()
});
reasons = [];
ngOnInit(){
setTimeout(() => {
this.reasons = [
{prop: 'something'},
{prop: 'anything'},
{prop: 'some'}
];
}, 2000);
}
}
<form [formGroup]="formParent">
<mat-form-field>
<mat-select formControlName="snoozeReason" placeholder="Favorite food">
<mat-option *ngFor="let reason of reasons" [value]="reason.prop">
{{ reason.prop }}
</mat-option>
</mat-select>
</mat-form-field>
</form>
谢谢@Guillodacosta!
我有另一双眼睛来验证代码是否正确。我相信我现在的问题是我与我的 UI 包有冲突。 Ng-Bootstrap 可能导致我的 Material 2 Select 无法正确呈现。
在过去的周末,我花了一些时间来复制我的场景,并验证了我拥有的代码应该与填充 Material 2 Select 下拉列表的异步数据一起工作。
我是 运行 Angular 4.3.4 和 Material 2.0.0-beta.12,我在尝试创建 mat-select 以生成动态时遇到问题来自异步源的垫选项列表。我得到的只是占位符,下拉列表不会展开。我什至没有收到错误代码。
这是我的代码示例 已更新:
<form [formGroup]="snoozeForm" novalidate>
<div fxLayout="column">
<mat-form-field>
<mat-select formControlName="snooze_reason">
<mat-option [value]="reason.attributes.snooze_reason_code" *ngFor="let reason of reasons">{{ reason }}</mat-option>
</mat-select>
</mat-form-field>
</form>
如您所见,reasons 是动态填充的数组。我一定是忽略了一些简单的事情,但我确信 原因 正在填充。
这是我填充数组的位置:
ngOnInit() {
this.generateForm();
this.httpService.getSnoozeReasons()
.subscribe( res => {
this.reasons = res;
}, (error: any) => {
const msg: Message = { title: 'Frontend API Error', textbody1: '' };
if (error.message) {
msg.textbody1 = <any>error.message;
msg.textbody2 = `Task-details component - Snooze reasons`;
} else {
msg.textbody1 = `HTTP ${error.status}: ${error.statusText}`;
msg.textbody2 = `Task-details - Snooze reasons: ${error.url}`;
}
this.messageService.createMessage(msg);
})
;
}
generateForm(): void {
this.snoozeForm = this.fb.group({
snooze_reason: ['', [Validators.required]],
snooze_hour: ['', [Validators.pattern('[0-9]*'), Validators.max(72)]],
snooze_minute: ['', [Validators.required, Validators.min(5), Validators.pattern('[0-9]*')]]
});
}
有人遇到过异步数据和 Select 表单控件的问题吗?
我认为问题不是异步数组的原因,否则明智的做法是当您使用 formControlName="snooze_reason" 时,如果您尝试删除 formcontrolname,"select" 工作正常。发生这种情况是因为 Angular 表单中的控件需要声明为表单组的子项。
import {Component} from '@angular/core';
import {FormControl, FormGroup} from '@angular/forms';
@Component({
selector: 'material-select-angular',
templateUrl: 'material-select-angular.html',
})
export class MaterialSelectAngular implements OnInit {
formParent = new FormGroup({
snoozeReason: new FormControl()
});
reasons = [];
ngOnInit(){
setTimeout(() => {
this.reasons = [
{prop: 'something'},
{prop: 'anything'},
{prop: 'some'}
];
}, 2000);
}
}
<form [formGroup]="formParent">
<mat-form-field>
<mat-select formControlName="snoozeReason" placeholder="Favorite food">
<mat-option *ngFor="let reason of reasons" [value]="reason.prop">
{{ reason.prop }}
</mat-option>
</mat-select>
</mat-form-field>
</form>
谢谢@Guillodacosta!
我有另一双眼睛来验证代码是否正确。我相信我现在的问题是我与我的 UI 包有冲突。 Ng-Bootstrap 可能导致我的 Material 2 Select 无法正确呈现。
在过去的周末,我花了一些时间来复制我的场景,并验证了我拥有的代码应该与填充 Material 2 Select 下拉列表的异步数据一起工作。