首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何不使用PrimeNg将选中的复选框值传递给带有NgModel的子组件?角度

如何不使用PrimeNg将选中的复选框值传递给带有NgModel的子组件?角度
EN

Stack Overflow用户
提问于 2020-06-18 21:23:18
回答 2查看 616关注 0票数 0

我有一个基本的应用程序,我有一个表单,我想把选中的复选框值传递给子组件,这样在父组件的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

代码语言:javascript
运行
复制
<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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
@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
      }))
    }
  }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-18 21:56:10

也许只需要使用表单值?

代码语言:javascript
运行
复制
<app-select-statements [statements]="form.get('statements').value">
票数 2
EN

Stack Overflow用户

发布于 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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62459629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档