Skip to content

Commit 2a2f381

Browse files
feat(ng2.rx): Added RxJS Observables for transitions and states:
- Transitions started - Transitions successful - Parameter values - State registered - State deregistered
1 parent 999c42a commit 2a2f381

File tree

2 files changed

+54
-0
lines changed

2 files changed

+54
-0
lines changed

src/ng2/providers.ts

+2
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ import {Resolvable} from "../resolve/resolvable";
6767
import {ngModuleResolvablesBuilder} from "./statebuilders/lazyLoadNgModuleResolvable";
6868
import {flattenR} from "../common/common";
6969
import {UIROUTER_STATES_TOKEN} from "./uiRouterNgModule";
70+
import {UIRouterRx} from "./rx";
7071

7172
export const NG1_UIROUTER_TOKEN = new OpaqueToken("$uiRouter");
7273

@@ -99,6 +100,7 @@ let uiRouterFactory = (injector: Injector) => {
99100
// ----------------- Create router -----------------
100101
// Create a new ng2 UIRouter and configure it for ng2
101102
let router = new UIRouter();
103+
new UIRouterRx(router);
102104
let registry = router.stateRegistry;
103105

104106
// ----------------- Configure for ng2 -------------

src/ng2/rx.ts

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import {Observable, ReplaySubject} from "rxjs/Rx";
2+
import {Transition} from "../transition/transition";
3+
import {UIRouter} from "../router";
4+
import {StateDeclaration} from "../state/interface";
5+
6+
export interface StatesChangedEvent {
7+
currentStates: StateDeclaration[];
8+
registered: StateDeclaration[];
9+
deregistered: StateDeclaration[];
10+
}
11+
12+
declare module '../globals' {
13+
interface UIRouterGlobals {
14+
states$?: Observable<StatesChangedEvent>;
15+
start$?: Observable<Transition>;
16+
success$?: Observable<Transition>;
17+
params$?: Observable<{ [paramName: string]: any }>;
18+
}
19+
}
20+
21+
/** Augments UIRouterGlobals with observables for transition starts, successful transitions, and state parameters */
22+
export class UIRouterRx {
23+
private deregisterFns: Function[] = [];
24+
25+
constructor(router: UIRouter) {
26+
let start$ = new ReplaySubject<Transition>(1);
27+
let success$ = <Observable<Transition>> start$.mergeMap((t: Transition) => t.promise.then(() => t));
28+
let params$ = success$.map((transition: Transition) => transition.params());
29+
30+
let states$ = new ReplaySubject<StatesChangedEvent>(1);
31+
function onStatesChangedEvent(event: string, states: StateDeclaration[]) {
32+
let changeEvent = {
33+
currentStates: router.stateRegistry.get(),
34+
registered: [],
35+
deregistered: []
36+
};
37+
38+
if (event) changeEvent[event] = states;
39+
states$.next(changeEvent);
40+
}
41+
42+
this.deregisterFns.push(router.transitionService.onStart({}, transition => start$.next(transition)));
43+
this.deregisterFns.push(router.stateRegistry.onStatesChanged(onStatesChangedEvent));
44+
onStatesChangedEvent(null, null);
45+
Object.assign(router.globals, {start$, success$, params$, states$});
46+
}
47+
48+
dispose() {
49+
this.deregisterFns.forEach(deregisterFn => deregisterFn());
50+
this.deregisterFns = [];
51+
}
52+
}

0 commit comments

Comments
 (0)