Skip to content

Commit 4cb174d

Browse files
committed
angular: use inject() instead of constructor injection
Replace using constructor injection with using the inject function. Constructor injections is discouraged by angular's lint rules starting with Angular 20.
1 parent 63e3f90 commit 4cb174d

22 files changed

Lines changed: 82 additions & 145 deletions

MIGRATION.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,39 @@ When using JSON Forms 3.8, your Angular application now needs to target Angular
4646

4747
Use JSON Forms 3.7 if you need to stay on Angular 19.
4848

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

5184
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)