Home > Web Front-end > JS Tutorial > An in-depth analysis of how Angular directives maintain separation of concerns?

An in-depth analysis of how Angular directives maintain separation of concerns?

青灯夜游
Release: 2022-01-23 09:30:34
forward
2329 people have browsed it

How do Angular directives maintain separation of concerns? This article will show you how to maintain separation of concerns through the Angular directive. I hope it will be helpful to you!

An in-depth analysis of how Angular directives maintain separation of concerns?

Suppose we have a date picker component in our application. Every time the user changes the date, an event is sent to the analytics provider. So far, we have only used it once, so this analysis interface can be placed in the component that uses it:

header-1.ts

import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroyed';

@UntilDestroy()
class FooComponent {
  timespanControl = new FormControl();

  ngOnInit() {
    this.timespanControl.valueChanges
      .pipe(untilDestroyed(this))
      .subscribe(({ preset }) => {
        this.analyticsService.track('timespan-filter apply', {
          value: preset,
        });
      });
  }
}
Copy after login

But, now We have more places to use this analysis interface, and we don't want to write the same code repeatedly. Someone might suggest that this code could be incorporated into a date picker and passed as an input parameter. [Related tutorial recommendations: "angular tutorial"]

data-picker-1.component.ts

class DatePickerComponent {
  @Input() analyticsContext: string;
   
  constructor(private analyticsService: AnalyticsService) {}

  apply() {
    this.analyticsService.track('timespan-filter apply', {
      context: this.analyticsContext,
      value: this.preset,
    });

    ...
  }
}
Copy after login

Indeed, this can be achieved, But this is not an ideal design. Separation of concerns means that the date picker itself has nothing to do with the analysis interface, and it does not need to know any information about the analysis interface.

In addition, because the date picker is an internal component, we can modify its source code, but what if it is a third-party component? How to solve it?

A better choice here is the Angular directive. Create a directive, obtain a reference to the form through DI, and subscribe to changes in internal values ​​to trigger analysis events. datePickerAnalytics.directive.ts

@UntilDestroy()
@Directive({
  selector: '[datePickerAnalytics]',
})
export class DatePickerAnalyticsDirective implements OnInit {
  @Input('datePickerAnalytics') analyticsContext: string;

  constructor(
    private dateFormControl: NgControl,
    private analyticsService: AnalyticsService
  ) {}

  ngOnInit() {
    this.dateFormControl
      .control.valueChanges.pipe(untilDestroyed(this))
      .subscribe(({ preset }) => {
        this.analyticsService.track(
          'timespan-filter apply',
          {
            value: preset,
            context: this.analyticsContext
          }
        );
      });
  }
}
Copy after login

It can now be used every time the date picker is used.

<date-picker [formControl]="control" datePickerAnalytics="fooPage"></date-picker>
Copy after login

English original address: https://netbasal.com/maintaining-separation-of-concerns-through-angular-directives-8362ccdf655b

Original author: Netanel Basal

For more programming-related knowledge, please visit: Programming Video! !

The above is the detailed content of An in-depth analysis of how Angular directives maintain separation of concerns?. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:juejin.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template