Как переместить функцию внутри службы? - PullRequest
0 голосов
/ 28 марта 2020

У меня есть эта функция, которую я использую для изменения значения одного элемента управления в зависимости от значения другого элемента управления. Поскольку я использую эту функцию в нескольких компонентах, я решил переместить ее в службу и вызвать ее оттуда. Дело в том, что я должен подписаться на изменения формы formControl. Итак, мой вопрос:

Как мне переписать эту функцию, чтобы я мог использовать ее внутри службы, не подписываясь внутри службы?

Вот моя функция:

  setDefault(formarray: FormArray, index: number, sourceCtrl:string, targetCtrl:string ) {
        formarray.at(index)
            .get(sourceCtrl)
            .valueChanges
            .pipe(takeUntil(this._destroy))
            .subscribe(value => {
                if (value !== null && value !== "" && value !== undefined) {
                    formarray.at(index)
                        .get(targetCtrl)
                        .setValue(this.default);
                } else {
                    formarray.at(index)
                        .get(targetCtrl)
                        .setValue(null);
                }
            });
    }

1 Ответ

0 голосов
/ 28 марта 2020

Как и jonrsharpe сказал, что вы можете вернуть observable. Везде, где вы отписываетесь от него, не должно быть проблем, потому что каждая подписка будет отдельной.

Но я вижу, что код в subscribe также может быть повторяющимся, поэтому, возможно, вы сможете воспользоваться объектно-ориентированным программированием .

Создайте базовый класс:

export class BaseFormClass() {
 setDefault(formarray: FormArray, index: number, sourceCtrl:string, targetCtrl:string ) {
        formarray.at(index)
            .get(sourceCtrl)
            .valueChanges
            .pipe(takeUntil(this._destroy))
            .subscribe(value => {
                if (value !== null && value !== "" && value !== undefined) {
                    formarray.at(index)
                        .get(targetCtrl)
                        .setValue(this.default);
                } else {
                    formarray.at(index)
                        .get(targetCtrl)
                        .setValue(null);
                }
            });
    }
}

И какой компонент, которому требуется эта функция, может расширяться BaseFormClass.

export class Component1 extends BaseFormClass implements OnInit {
  ngOnInit() {
    this.setDefault(......);
  }
}
...