Как передать выбранные значения флажков в дочерний компонент с помощью PrimeNg без использования NgModel? Angular - PullRequest
0 голосов
/ 19 июня 2020

У меня есть приложение basi c, в котором у меня есть форма, и я хочу передать выбранные значения флажков дочернему компоненту, чтобы флажки, выбранные в p-multiSelect на родительском элементе, были единственными элементы, которые появляются в p-dropdown в дочернем элементе.

Используя [(ngModel)], это работает по большей части, за исключением случаев, когда я вставляю значения в параметры p-multiSelect с данными из API. Кроме того, это приводит к следующей ошибке:

It looks like you're using ngModel on the same form field as formControlName. 
Support for using the ngModel input property and
ngModelChange event with reactive form directives has been deprecated
in Angular v6 and will be removed in Angular v7

For more information on this, see our API docs here: https://angular.io/api/forms/FormControlName#use-with-ngmodel

Я не смог найти хороший способ заставить это работать, так как я передаю выбранное значение, которое похоже, что он должен исходить от [(ngModel)]. Есть ли другой способ передать элементы выбора из p-multiSelect в дочерний компонент без использования ngModel?

Как вы увидите в коде, это работает. Значение передается вниз. Однако, если я использую patchValue() в форме и привожу эту опцию multiSelect откуда-то еще, она не будет работать с NgModel. Я также получаю указанную выше ошибку, потому что я использую ngModel на FormControlName

Вот stackblitz и код ниже. Я значительно упростил его и удалил форму из дочернего компонента, так что он просто получает значение.

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' },
  ];
}

Компонент SelectStatement

@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
      }))
    }
  }
}

Ответы [ 2 ]

2 голосов

Может просто использовать значение формы?

<app-select-statements [statements]="form.get('statements').value">
0 голосов
/ 19 июня 2020

Нельзя смешивать реактивные формы и формы, управляемые шаблоном. Вы используете реактивные формы, поэтому вам не следует удалять ngModel, а использовать только formControlName. Если вам нужно прослушивать (ngModelChange), вы должны вместо этого подписаться в конструкторе на изменения значений в форме с помощью this.form.valuechanges.subscribe(...)

См. Также https://www.pluralsight.com/guides/difference-between-template-driven-and-reactive-forms-angular

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...