1
1
import { Ng2StateDeclaration } from "./interface" ;
2
- import { NgModule , NgModuleMetadataType } from "@angular/core" ;
2
+ import { NgModule , NgModuleMetadataType , OpaqueToken } from "@angular/core" ;
3
3
import { UIROUTER_DIRECTIVES } from "./directives/directives" ;
4
4
import { UIROUTER_PROVIDERS } from "./providers" ;
5
5
import { UIView } from "./directives/uiView" ;
6
+ import { uniqR } from "../common/common" ;
6
7
7
8
@NgModule ( {
8
9
declarations : [ UIROUTER_DIRECTIVES ] ,
@@ -19,25 +20,28 @@ export class _UIRouterModule {}
19
20
* by adding a `states` array.
20
21
*/
21
22
export interface UIRouterModuleMetadata extends NgModuleMetadataType {
22
- states : Ng2StateDeclaration [ ]
23
+ states ? : Ng2StateDeclaration [ ]
23
24
}
24
25
26
+ export const UIROUTER_STATES_TOKEN = new OpaqueToken ( "UIRouterStates" ) ;
27
+
25
28
/**
26
29
* Declares a NgModule with UI-Router states
27
30
*
28
31
* A Typescript decorator for declaring a [NgModule](https://angular.io/docs/ts/latest/guide/ngmodule.html)
29
32
* which contains UI-Router states.
30
33
*
31
- * This decorator analyzes the `states` in the module, and adds module `declarations` and `entryComponents`
32
- * for all routed Components .
33
- *
34
+ * This decorator analyzes the `states` in the module.
35
+ * It adds all routed `component:`(s) for each state to the module's `declarations` and `entryComponents` .
36
+ *
34
37
* @example
35
38
* ```js
36
39
*
37
40
* var homeState = { name: 'home', url: '/home', component: Home };
38
41
* var aboutState = { name: 'about', url: '/about', component: About };
39
42
* @UIRouterModule ({
40
43
* imports: [BrowserModule],
44
+ * declarations: [NonRoutedComponent],
41
45
* states: [homeState, aboutState]
42
46
* }) export class AppModule {};
43
47
* ```
@@ -47,16 +51,19 @@ export interface UIRouterModuleMetadata extends NgModuleMetadataType {
47
51
*/
48
52
export function UIRouterModule ( moduleMetaData : UIRouterModuleMetadata ) {
49
53
let states = moduleMetaData . states || [ ] ;
54
+
55
+ // Get the component classes for all views for all states in the module
50
56
let components = states . map ( state => state . views || { $default : state } )
51
57
. map ( viewObj => Object . keys ( viewObj ) . map ( key => viewObj [ key ] . component ) )
52
58
. reduce ( ( acc , arr ) => acc . concat ( arr ) , [ ] )
53
59
. filter ( x => typeof x === 'function' ) ;
54
60
55
- moduleMetaData . imports = ( moduleMetaData . imports || [ ] ) . concat ( _UIRouterModule ) ;
56
- moduleMetaData . declarations = ( moduleMetaData . declarations || [ ] ) . concat ( components ) ;
57
- moduleMetaData . entryComponents = ( moduleMetaData . entryComponents || [ ] ) . concat ( components ) ;
61
+ moduleMetaData . imports = < any [ ] > ( moduleMetaData . imports || [ ] ) . concat ( _UIRouterModule ) . reduce ( uniqR , [ ] ) ;
62
+ moduleMetaData . declarations = < any [ ] > ( moduleMetaData . declarations || [ ] ) . concat ( components ) . reduce ( uniqR , [ ] ) ;
63
+ moduleMetaData . entryComponents = < any [ ] > ( moduleMetaData . entryComponents || [ ] ) . concat ( components ) . reduce ( uniqR , [ ] ) ;
64
+ moduleMetaData . providers = ( moduleMetaData . providers || [ ] ) . concat ( { provide : UIROUTER_STATES_TOKEN , useValue : states } ) ;
58
65
59
66
return function ( moduleClass ) {
60
67
return NgModule ( moduleMetaData ) ( moduleClass ) ;
61
68
}
62
- }
69
+ }
0 commit comments