I'm trying to migrate an old library of Angular components to standalone components.
A number of the components have a lot in common, so I use a superclass for all of the common behavior. At least as I was accustomed to doing things, the superclass of a @Component shouldn't be another @Component, but rather a @Directive.
The start of the superclass looks like this:
// @dynamic
@Directive()
export abstract class DigitSequenceEditorDirective<T> implements
AfterViewInit, ControlValueAccessor, OnInit, OnDestroy, Validator {
// ...
And one the subclass components starts like this:
// @dynamic
@Component({
selector: 'tbw-time-editor',
animations: [BACKGROUND_ANIMATIONS],
templateUrl: '../digit-sequence-editor/digit-sequence-editor.directive.html',
styleUrls: ['../digit-sequence-editor/digit-sequence-editor.directive.scss', './time-editor.component.scss'],
providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TimeEditorComponent), multi: true },
{ provide: NG_VALIDATORS, useExisting: forwardRef(() => TimeEditorComponent), multi: true }]
})
export class TimeEditorComponent extends DigitSequenceEditorDirective<number> implements OnInit {
// ...
The problem now, porting this to Angular 19 and trying to use a standalone design, is that the HTML for the directive contains some CommonModule features like [ngClass] and [ngStyle]. (There are also uses of *ngIf and the like, but those I can get rid of using @if, @for, etc.)
A non-functional recommendation by Google AI for using CommonModule features in a directive looks like this:
import { Directive, Input } from '@angular/core';
import { NgIf } from '@angular/common';
@Directive({
selector: '[appMyStandalone]',
standalone: true,
imports: [NgIf] // Can't be done! No `imports` field! (I'd have NgClass and NgStyle here if this worked)
})
export class MyStandaloneDirective {
@Input() appMyStandalone: boolean = false;
}
If I can't use imports with a directive, how do I resolve the red squiggly line stuff below?
