Skip to content

Commit d248518

Browse files
committed
angular: use @Inject instead of constructor injection
Replace using constructor injection with using @Inject. Constructor injections is discouraged by angular's lint rules starting with Angular 20.
1 parent d1f5ab0 commit d248518

22 files changed

Lines changed: 84 additions & 145 deletions

MIGRATION.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,41 @@ return this.t(label, label) as string;
4040

4141
This does not affect the Composition API where `Translator` is accessed directly from a `ComputedRef`.
4242

43+
### Angular renderers use `inject()` instead of constructor injection
44+
45+
All Angular base classes (`JsonFormsAbstractControl`, `LayoutRenderer`, `JsonFormsOutlet`, `JsonForms`) now use Angular's `inject()` function instead of constructor parameter injection.
46+
47+
If you have custom renderers that extend these base classes and pass `JsonFormsAngularService` (or other dependencies) to `super()`, you need to remove those constructor parameters and the `super(...)` call.
48+
49+
The `JsonFormsAngularService` is now provided as a `protected` field on `JsonFormsAbstractControl`, so custom control renderers can use `this.jsonFormsService` directly without injecting it themselves.
50+
51+
**Before:**
52+
53+
```ts
54+
@Component({ ... })
55+
export class MyCustomRenderer extends JsonFormsControl {
56+
constructor(
57+
private myService: MyService,
58+
jsonFormsService: JsonFormsAngularService
59+
) {
60+
super(jsonFormsService);
61+
}
62+
}
63+
```
64+
65+
**After:**
66+
67+
```ts
68+
@Component({ ... })
69+
export class MyCustomRenderer extends JsonFormsControl {
70+
private myService = inject(MyService);
71+
}
72+
```
73+
74+
If your custom renderer extends `LayoutRenderer`, the same applies.
75+
Remove the constructor parameters for `JsonFormsAngularService` and `ChangeDetectorRef`, as both are now injected by the base class.
76+
The `ChangeDetectorRef` is available as a `protected` field `this.changeDetectionRef` on `LayoutRenderer`.
77+
4378
### Angular material removes hammerjs
4479

4580
The angular material package no longer depends or imports the `hammerjs` package.

packages/angular-material/src/library/controls/boolean.renderer.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,10 @@ import {
2626
ChangeDetectionStrategy,
2727
ChangeDetectorRef,
2828
Component,
29+
inject,
2930
ViewRef,
3031
} from '@angular/core';
31-
import { JsonFormsAngularService, JsonFormsControl } from '@jsonforms/angular';
32+
import { JsonFormsControl } from '@jsonforms/angular';
3233
import { isBooleanControl, RankedTester, rankWith } from '@jsonforms/core';
3334
import { CommonModule } from '@angular/common';
3435
import { MatCheckboxModule } from '@angular/material/checkbox';
@@ -71,12 +72,7 @@ import { MatFormFieldModule } from '@angular/material/form-field';
7172
imports: [CommonModule, MatCheckboxModule, MatFormFieldModule],
7273
})
7374
export class BooleanControlRenderer extends JsonFormsControl {
74-
constructor(
75-
jsonformsService: JsonFormsAngularService,
76-
private changeDetectionRef: ChangeDetectorRef
77-
) {
78-
super(jsonformsService);
79-
}
75+
private changeDetectionRef = inject(ChangeDetectorRef);
8076
isChecked = () => this.data || false;
8177
getEventValue = (event: any) => event.checked;
8278

packages/angular-material/src/library/controls/date.renderer.ts

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
import {
2626
Component,
2727
ChangeDetectionStrategy,
28-
Inject,
28+
inject,
2929
ViewEncapsulation,
3030
} from '@angular/core';
3131
import {
@@ -36,7 +36,7 @@ import {
3636
rankWith,
3737
StatePropsOfControl,
3838
} from '@jsonforms/core';
39-
import { JsonFormsAngularService, JsonFormsControl } from '@jsonforms/angular';
39+
import { JsonFormsControl } from '@jsonforms/angular';
4040
import { DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';
4141
import { MyFormat } from '../util/date-format';
4242
import { DayJsDateAdapter } from '../util/dayjs-date-adapter';
@@ -126,13 +126,8 @@ export class DateControlRenderer extends JsonFormsControl {
126126
startView = '';
127127
panelClass = '';
128128

129-
constructor(
130-
jsonformsService: JsonFormsAngularService,
131-
@Inject(MAT_DATE_FORMATS) private dateFormat: MyFormat,
132-
@Inject(DateAdapter) private dateAdapter: DayJsDateAdapter
133-
) {
134-
super(jsonformsService);
135-
}
129+
private dateFormat = inject<MyFormat>(MAT_DATE_FORMATS);
130+
private dateAdapter = inject(DateAdapter) as DayJsDateAdapter;
136131

137132
getEventValue = (event: any) => {
138133
const value = event.value ? event.value : event;

packages/angular-material/src/library/controls/enum.renderer.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import {
2929
OnInit,
3030
} from '@angular/core';
3131
import type { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete';
32-
import { JsonFormsAngularService, JsonFormsControl } from '@jsonforms/angular';
32+
import { JsonFormsControl } from '@jsonforms/angular';
3333
import {
3434
Actions,
3535
composeWithUi,
@@ -120,10 +120,6 @@ export class OneOfEnumControlRenderer
120120
shouldFilter: boolean;
121121
focused = false;
122122

123-
constructor(jsonformsService: JsonFormsAngularService) {
124-
super(jsonformsService);
125-
}
126-
127123
protected override mapToProps(
128124
state: JsonFormsState
129125
): StatePropsOfControl & OwnPropsOfEnum {

packages/angular-material/src/library/controls/number.renderer.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
THE SOFTWARE.
2424
*/
2525
import { ChangeDetectionStrategy, Component } from '@angular/core';
26-
import { JsonFormsAngularService, JsonFormsControl } from '@jsonforms/angular';
26+
import { JsonFormsControl } from '@jsonforms/angular';
2727
import {
2828
isIntegerControl,
2929
isNumberControl,
@@ -92,10 +92,6 @@ export class NumberControlRenderer extends JsonFormsControl {
9292
decimalSeparator: string;
9393
focused = false;
9494

95-
constructor(jsonformsService: JsonFormsAngularService) {
96-
super(jsonformsService);
97-
}
98-
9995
onChange(ev: any) {
10096
const data = this.oldValue
10197
? ev.target.value.replace(this.oldValue, '')

packages/angular-material/src/library/controls/range.renderer.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,11 @@
2424
*/
2525
import {
2626
ChangeDetectionStrategy,
27-
Component,
2827
ChangeDetectorRef,
28+
Component,
29+
inject,
2930
} from '@angular/core';
30-
import { JsonFormsAngularService, JsonFormsControl } from '@jsonforms/angular';
31+
import { JsonFormsControl } from '@jsonforms/angular';
3132
import { isRangeControl, RankedTester, rankWith } from '@jsonforms/core';
3233
import { CommonModule } from '@angular/common';
3334
import { MatSliderModule } from '@angular/material/slider';
@@ -80,12 +81,7 @@ export class RangeControlRenderer extends JsonFormsControl {
8081
multipleOf: number;
8182
focused = false;
8283

83-
constructor(
84-
jsonformsService: JsonFormsAngularService,
85-
private changeDetectorRef: ChangeDetectorRef
86-
) {
87-
super(jsonformsService);
88-
}
84+
private changeDetectorRef = inject(ChangeDetectorRef);
8985
getEventValue = (event: number) => Number(event);
9086
mapAdditionalProps() {
9187
if (this.scopedSchema) {

packages/angular-material/src/library/controls/text.renderer.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
THE SOFTWARE.
2424
*/
2525
import { ChangeDetectionStrategy, Component } from '@angular/core';
26-
import { JsonFormsAngularService, JsonFormsControl } from '@jsonforms/angular';
26+
import { JsonFormsControl } from '@jsonforms/angular';
2727
import { isStringControl, RankedTester, rankWith } from '@jsonforms/core';
2828
import { CommonModule } from '@angular/common';
2929
import { ReactiveFormsModule } from '@angular/forms';
@@ -71,9 +71,6 @@ import { MatInputModule } from '@angular/material/input';
7171
})
7272
export class TextControlRenderer extends JsonFormsControl {
7373
focused = false;
74-
constructor(jsonformsService: JsonFormsAngularService) {
75-
super(jsonformsService);
76-
}
7774
getEventValue = (event: any) => event.target.value || undefined;
7875
getType = (): string => {
7976
if (this.uischema.options && this.uischema.options.format) {

packages/angular-material/src/library/controls/textarea.renderer.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
THE SOFTWARE.
2424
*/
2525
import { ChangeDetectionStrategy, Component } from '@angular/core';
26-
import { JsonFormsAngularService, JsonFormsControl } from '@jsonforms/angular';
26+
import { JsonFormsControl } from '@jsonforms/angular';
2727
import { isMultiLineControl, RankedTester, rankWith } from '@jsonforms/core';
2828
import { CommonModule } from '@angular/common';
2929
import { ReactiveFormsModule } from '@angular/forms';
@@ -70,9 +70,6 @@ import { MatInputModule } from '@angular/material/input';
7070
})
7171
export class TextAreaRenderer extends JsonFormsControl {
7272
focused = false;
73-
constructor(jsonformsService: JsonFormsAngularService) {
74-
super(jsonformsService);
75-
}
7673
getEventValue = (event: any) => event.target.value || undefined;
7774
}
7875
export const TextAreaRendererTester: RankedTester = rankWith(

packages/angular-material/src/library/controls/toggle.renderer.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,11 @@
2424
*/
2525
import {
2626
ChangeDetectionStrategy,
27-
Component,
2827
ChangeDetectorRef,
28+
Component,
29+
inject,
2930
} from '@angular/core';
30-
import { JsonFormsAngularService, JsonFormsControl } from '@jsonforms/angular';
31+
import { JsonFormsControl } from '@jsonforms/angular';
3132
import {
3233
and,
3334
isBooleanControl,
@@ -61,12 +62,7 @@ import { MatFormFieldModule } from '@angular/material/form-field';
6162
imports: [CommonModule, MatSlideToggleModule, MatFormFieldModule],
6263
})
6364
export class ToggleControlRenderer extends JsonFormsControl {
64-
constructor(
65-
jsonformsService: JsonFormsAngularService,
66-
private changeDetectorRef: ChangeDetectorRef
67-
) {
68-
super(jsonformsService);
69-
}
65+
private changeDetectorRef = inject(ChangeDetectorRef);
7066
isChecked = () => this.data || false;
7167
getEventValue = (event: any) => event.checked;
7268
mapAdditionalProps() {

packages/angular-material/src/library/layouts/array-layout.renderer.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,7 @@ import { MatButtonModule } from '@angular/material/button';
2929
import { MatIconModule } from '@angular/material/icon';
3030
import { MatBadgeModule } from '@angular/material/badge';
3131
import { MatTooltipModule } from '@angular/material/tooltip';
32-
import {
33-
JsonFormsAngularService,
34-
JsonFormsAbstractControl,
35-
JsonFormsModule,
36-
} from '@jsonforms/angular';
32+
import { JsonFormsAbstractControl, JsonFormsModule } from '@jsonforms/angular';
3733
import {
3834
arrayDefaultTranslations,
3935
ArrayLayoutProps,
@@ -192,9 +188,6 @@ export class ArrayLayoutRenderer
192188
tester: UISchemaTester;
193189
uischema: UISchemaElement;
194190
}[];
195-
constructor(jsonFormsService: JsonFormsAngularService) {
196-
super(jsonFormsService);
197-
}
198191
mapToProps(
199192
state: JsonFormsState
200193
): StatePropsOfArrayLayout & { translations: ArrayTranslations } {

0 commit comments

Comments
 (0)