我有一个基本的应用程序,我有一个表单,我想把选中的复选框值传递给子组件,这样在父组件的p-multiSelect
中选择的复选框是在子组件中p-dropdown
中唯一出现的项。
使用[(ngModel)]
在很大程度上起作用,除非我用来自API的数据将值修补到p-multiSelect
选项中。此外,这还会导致以下错误:
看起来,您在与ngModel相同的表单字段上使用formControlName。对于使用带有反应性表单指令的ngModel输入属性和ngModelChange事件的支持已在角v6中被取消,有关此的更多信息,请参见此处的API文档:https://angular.io/api/forms/FormControlName#use-with-ngmodel。
由于我正在传递一个选定的值,这似乎确实需要来自[(ngModel)]
,所以我一直无法找到一个好的方法来使它工作。是否有不同的方法将选择的项从p-multiSelect
传递到子组件而不使用ngModel?
正如您将能够在代码中看到的那样,这是可行的。这个值正在被传递下来。但是,如果我在表单上使用patchValue()
,并将此multiSelect选项从其他地方引入,则它不适用于NgModel
。我还得到了上面的错误,因为我在一个ngModel
上使用FormControlName
这里是一个堆栈闪电战和代码在下面。我已经极大地简化了它,并且从子组件中删除了表单,所以它只是得到了值。
AppComponent.html
<div style="padding: 10px; border: solid black 1px">
<form [formGroup]="form">
<span>Parent Component. Multi-select, where selected items are input into child comp dropdown</span>
<br>
<p-multiSelect
[options]="statementOptions"
formControlName="statements"
[(ngModel)]="selectedStatements">
</p-multiSelect>
<div style="margin-top: 10px; padding: 5px; border: solid black 1px;">
<span>Child Component, I want to receive selected items ,but am unaway how to without using ngModel</span>
<app-select-statements [statements]='selectedStatements'>
</app-select-statements>
</div>
</form>
</div>
AppComponent.Ts
export class AppComponent {
form: FormGroup;
constructor(private fb: FormBuilder) {
this.form = this.fb.group({
statements: ''
})
}
statementOptions = [
{ label: 'Item1', value: 'item1' },
{ label: 'item2', value: 'item2' },
{ label: 'Item3', value: 'item3' },
{ label: 'Item4', value: 'item4' },
{ label: 'Item5', value: 'item5' },
];
}
SelectStatementComponent
@Component({
selector: 'app-select-statements',
template: `
<div>
<p-dropdown
placeholder="Choose"
[options]="statements"
></p-dropdown>
</div>
`,
})
export class StatementComponent implements OnChanges {
@Input() statements;
//this maps the values in order to get back the
//label and value as required by the PrimeNg dropdown
ngOnChanges() {
if(this.statements) {
this.statements = this.statements.map((s) => ({
label: s,
value: s
}))
}
}
}
发布于 2020-06-18 21:56:10
也许只需要使用表单值?
<app-select-statements [statements]="form.get('statements').value">
发布于 2020-06-18 21:46:20
不能混合反应性表单和模板驱动窗体。您使用的是反应性表单,因此不应该删除ngModel
,而只使用formControlName
。如果您需要侦听(ngModelChange)
,则应该在构造函数中订阅this.form.valuechanges.subscribe(...)
表单中的值更改。
另见https://www.pluralsight.com/guides/difference-between-template-driven-and-reactive-forms-angular
https://stackoverflow.com/questions/62459629
复制相似问题