@@ -17,117 +17,67 @@ Library requires `@ngrx/store` module.
17
17
18
18
## Usage
19
19
20
- State (for example ` homepage.state .ts` ):
20
+ Import QueryModule in your app.module .ts:
21
21
``` ts
22
- import { queryReducer } from ' @ngsm/query' ;
23
- import { HomepageApiResponseDto } from ' your-api-dto.interfaces.ts' ;
22
+ import { QueryModule } from ' @ngsm/query' ;
24
23
25
- export interface HomepageQueryState {
26
- getHomepageApiQuery? : Query <HomepageApiResponseDto >;
27
- }
28
-
29
- export const HOMEPAGE_QUERY_KEY = ' homepageQuery' ;
30
-
31
- export interface HomepagePartialState {
32
- readonly [HOMEPAGE_QUERY_KEY ]: HomepageQueryState ;
33
- // Your feature states, for example:
34
- // readonly [HOMEPAGE_FEATURE_KEY]: HomepageState;
35
- }
36
- ```
37
-
38
- Reducer (for example ` homepage.reducer.ts ` ):
39
- ``` ts
40
- import { Action } from ' @ngrx/store' ;
41
- import { HomepageQueryState } from ' ./homepage.state' ;
42
-
43
- ...
44
-
45
- export function homepageQueryReducer(state : HomepageQueryState | undefined , action : Action ) {
46
- return queryReducer (state , action );
24
+ ... ,
25
+ @NgModule ({
26
+ ... .,
27
+ imports: [
28
+ ... .,
29
+ QueryModule
30
+ ]
47
31
}
48
32
` ` `
49
33
50
- Selectors (for example ` homepage.selectors.ts ` ):
51
- ``` ts
52
- import { createFeatureSelector , createSelector } from ' @ngrx/store' ;
53
-
54
- export const homepageQueryState = createFeatureSelector <HomepagePartialState , HomepageQueryState >(HOMEPAGE_QUERY_KEY );
55
-
56
- export const getHomepageApiQuery = createSelector (
57
- homepageQueryState ,
58
- (state : HomepageQueryState ) => state .getHomepageApiQuery
59
- );
60
- ```
61
34
62
- State module (for example ` homepage-state.module.ts ` ) :
35
+ How to use @Query decorator in your HTTP service :
63
36
` ` ` ts
64
- import { NgModule } from ' @angular/core' ;
65
- import { EffectsModule } from ' @ngrx/effects' ;
66
- import { StoreModule } from ' @ngrx/store' ;
37
+ import { Query } from ' @ngsm/query' ;
38
+ import { HttpClient } from ' @angular/common/http' ;
67
39
68
- import { HomapageEffects } from ' ./homepage.effects' ;
69
- import { HomapageFacade } from ' ./homepage.facade' ;
70
- import { homepageQueryReducer , homepageReducer } from ' ./homepage.reducer' ;
71
- import { HOMEPAGE_QUERY_KEY } from ' ./homepage.state' ;
72
-
73
- @NgModule ({
74
- imports: [
75
- StoreModule .forFeature (HOMEPAGE_QUERY_KEY , homepageQueryReducer ),
76
- EffectsModule .forFeature ([HomapageEffects ]),
77
- ],
78
- providers: [HomapageFacade ]
79
- })
80
- export class HomapageStateModule {}
81
- ```
40
+ @Injectable ()
41
+ export class CarRepository {
42
+ constructor (private http : HttpClient ) { }
82
43
83
- Effects (for example ` homepage.effects.ts ` ):
84
- ``` ts
85
- ...
86
-
87
- getHomepageApi$ = createEffect (() =>
88
- this .actions$ .pipe (
89
- ofType (HomepageActions .getHomepageApi ),
90
- mergeMap (() => concat (
91
- // run inProgress action
92
- of (QueryActions .inProgress ({ query: HomepageQuery .getHomepageApiQuery })),
93
- this .homepageRepository
94
- .getHomepageApi ()
95
- .pipe (
96
- mergeMap ((response ) => [
97
- // run success action
98
- QueryActions .success ({ query: HomepageQuery .getHomepageApiQuery , response }),
99
- ]),
100
- catchError (error => [
101
- // run failure action
102
- QueryActions .failure ({ query: HomepageQuery .getHomepageApiQuery , error }),
103
- ])
104
- )
105
- ))
106
- )
107
- );
108
-
109
- ...
44
+ @Query ({ name: ' getCars' , groups: [' cars' ] })
45
+ getCars(): Observable <object > {
46
+ return this .http .get <object >(' API_URL' );
47
+ }
48
+ }
110
49
` ` `
111
50
112
- Facade (for example ` homepage.facade .ts` ):
51
+ In your component (for example ` car . component .ts ` ):
113
52
` ` ` ts
114
53
...
54
+ import { QueryFacade } from ' @ngsm/query' ;
55
+ ...
115
56
116
- @Injectable ()
117
- export class HomepageFacade {
118
- getHomepageQuery$ = this .store .pipe (select (HomepageSelectors .getHomepageQuery ));
119
-
120
- loader$ = isQueryInProgress$ ([
121
- this .getHomepageQuery$ ,
122
- // add all feature queries
123
- ... ,
124
- ]);
125
-
126
- constructor (private store : Store <HomepagePartialState >) {}
127
-
128
- dispatch(action : Action ) {
129
- this .store .dispatch (action );
57
+ @Component ({
58
+ selector: ' app-cars' ,
59
+ templateUrl: ' ./cars.component.html' ,
60
+ })
61
+ export class CarsComponent implements OnInit , OnDestroy {
62
+ // Available methods:
63
+ loader$ = this .queryFacade .isInProgress$ (' cars' );
64
+ response$ = this .queryFacade .response$ <YOUR_TYPE >(' getCars' );
65
+ query$ = this .queryFacade .query$ <YOUR_TYPE >(' getCars' );
66
+ error$ = this .queryFacade .error$ (' getCars' );
67
+ status$ = this .queryFacade .status$ (' getCars' );
68
+
69
+ constructor (
70
+ private carRepository : CarRepository ,
71
+ private queryFacade : QueryFacade ,
72
+ ) {}
73
+
74
+ ngOnInit() {
75
+ this .carRepository
76
+ .getCars ()
77
+ .subscribe ();
130
78
}
79
+
80
+ ngOnDestroy() { }
131
81
}
132
82
` ` `
133
83
0 commit comments