Skip to content

Commit 0cb628e

Browse files
feat(ng2.NgModule): Add module's states to DI using UIROUTER_STATES_TOKEN
1 parent f06f6b6 commit 0cb628e

File tree

1 file changed

+16
-9
lines changed

1 file changed

+16
-9
lines changed

src/ng2/routerModule.ts

+16-9
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import {Ng2StateDeclaration} from "./interface";
2-
import {NgModule, NgModuleMetadataType} from "@angular/core";
2+
import {NgModule, NgModuleMetadataType, OpaqueToken} from "@angular/core";
33
import {UIROUTER_DIRECTIVES} from "./directives/directives";
44
import {UIROUTER_PROVIDERS} from "./providers";
55
import {UIView} from "./directives/uiView";
6+
import {uniqR} from "../common/common";
67

78
@NgModule({
89
declarations: [UIROUTER_DIRECTIVES],
@@ -19,25 +20,28 @@ export class _UIRouterModule {}
1920
* by adding a `states` array.
2021
*/
2122
export interface UIRouterModuleMetadata extends NgModuleMetadataType {
22-
states: Ng2StateDeclaration[]
23+
states?: Ng2StateDeclaration[]
2324
}
2425

26+
export const UIROUTER_STATES_TOKEN = new OpaqueToken("UIRouterStates");
27+
2528
/**
2629
* Declares a NgModule with UI-Router states
2730
*
2831
* A Typescript decorator for declaring a [NgModule](https://angular.io/docs/ts/latest/guide/ngmodule.html)
2932
* which contains UI-Router states.
3033
*
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+
*
3437
* @example
3538
* ```js
3639
*
3740
* var homeState = { name: 'home', url: '/home', component: Home };
3841
* var aboutState = { name: 'about', url: '/about', component: About };
3942
* @UIRouterModule({
4043
* imports: [BrowserModule],
44+
* declarations: [NonRoutedComponent],
4145
* states: [homeState, aboutState]
4246
* }) export class AppModule {};
4347
* ```
@@ -47,16 +51,19 @@ export interface UIRouterModuleMetadata extends NgModuleMetadataType {
4751
*/
4852
export function UIRouterModule(moduleMetaData: UIRouterModuleMetadata) {
4953
let states = moduleMetaData.states || [];
54+
55+
// Get the component classes for all views for all states in the module
5056
let components = states.map(state => state.views || { $default: state })
5157
.map(viewObj => Object.keys(viewObj).map(key => viewObj[key].component))
5258
.reduce((acc, arr) => acc.concat(arr), [])
5359
.filter(x => typeof x === 'function');
5460

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 });
5865

5966
return function(moduleClass) {
6067
return NgModule(moduleMetaData)(moduleClass);
6168
}
62-
}
69+
}

0 commit comments

Comments
 (0)