Skip to content

Commit f4103cb

Browse files
author
vakrilov
committed
Add ns-module-factory-loader
1 parent a5ecaa2 commit f4103cb

File tree

7 files changed

+230
-165
lines changed

7 files changed

+230
-165
lines changed

Diff for: nativescript-angular/nativescript.module.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@ import {
1717
NgModule, NO_ERRORS_SCHEMA,
1818
} from '@angular/core';
1919
import {
20-
defaultPageProvider, defaultFrameProvider, defaultDeviceProvider
20+
defaultPageProvider,
21+
defaultFrameProvider,
22+
defaultDeviceProvider
2123
} from "./platform-providers";
24+
2225
import { NS_DIRECTIVES } from './directives';
2326

2427
import * as nativescriptIntl from "nativescript-intl";
@@ -39,6 +42,7 @@ export function errorHandlerFactory() {
3942
defaultFrameProvider,
4043
defaultPageProvider,
4144
defaultDeviceProvider,
45+
4246
NativeScriptRootRenderer,
4347
{ provide: RootRenderer, useClass: NativeScriptRootRenderer },
4448
NativeScriptRenderer,

Diff for: nativescript-angular/platform-common.ts

+128-128
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,16 @@ import './polyfills/array';
66
import './polyfills/console';
77

88
import {
9-
Type,
10-
Injector,
11-
CompilerOptions,
12-
PlatformRef,
13-
NgModuleFactory,
14-
NgModuleRef,
15-
EventEmitter,
16-
Provider,
17-
Sanitizer,
18-
OpaqueToken,
9+
Type,
10+
Injector,
11+
CompilerOptions,
12+
PlatformRef,
13+
NgModuleFactory,
14+
NgModuleRef,
15+
EventEmitter,
16+
Provider,
17+
Sanitizer,
18+
OpaqueToken
1919
} from '@angular/core';
2020

2121
import { rendererLog, rendererError } from "./trace";
@@ -35,160 +35,160 @@ let lastBootstrappedModule: WeakRef<NgModuleRef<any>>;
3535
type BootstrapperAction = () => Promise<NgModuleRef<any>>;
3636

3737
interface BootstrapParams {
38-
appModuleType: Type<any>;
39-
appOptions?: AppOptions;
38+
appModuleType: Type<any>;
39+
appOptions?: AppOptions;
4040
}
4141

4242
export interface AppOptions {
43-
bootInExistingPage: boolean;
44-
cssFile?: string;
45-
startPageActionBarHidden?: boolean;
43+
bootInExistingPage: boolean;
44+
cssFile?: string;
45+
startPageActionBarHidden?: boolean;
4646
}
4747

4848
export type PlatformFactory = (extraProviders?: Provider[]) => PlatformRef;
4949

5050
export class NativeScriptSanitizer extends Sanitizer {
51-
sanitize(context: any, value: string): string {
52-
return value;
53-
}
51+
sanitize(context: any, value: string): string {
52+
return value;
53+
}
5454
}
5555

5656
export const COMMON_PROVIDERS = [
57-
defaultPageFactoryProvider,
58-
{ provide: Sanitizer, useClass: NativeScriptSanitizer },
57+
defaultPageFactoryProvider,
58+
{ provide: Sanitizer, useClass: NativeScriptSanitizer }
5959
];
6060

6161
export class NativeScriptPlatformRef extends PlatformRef {
62-
private _bootstrapper: BootstrapperAction;
62+
private _bootstrapper: BootstrapperAction;
6363

64-
constructor(private platform: PlatformRef, private appOptions?: AppOptions) {
65-
super();
66-
}
64+
constructor(private platform: PlatformRef, private appOptions?: AppOptions) {
65+
super();
66+
}
6767

68-
bootstrapModuleFactory<M>(moduleFactory: NgModuleFactory<M>): Promise<NgModuleRef<M>> {
69-
this._bootstrapper = () => this.platform.bootstrapModuleFactory(moduleFactory);
68+
bootstrapModuleFactory<M>(moduleFactory: NgModuleFactory<M>): Promise<NgModuleRef<M>> {
69+
this._bootstrapper = () => this.platform.bootstrapModuleFactory(moduleFactory);
7070

71-
this.bootstrapApp();
71+
this.bootstrapApp();
7272

73-
return null; //Make the compiler happy
74-
}
73+
return null; //Make the compiler happy
74+
}
7575

76-
bootstrapModule<M>(moduleType: Type<M>, compilerOptions: CompilerOptions | CompilerOptions[] = []): Promise<NgModuleRef<M>> {
77-
this._bootstrapper = () => this.platform.bootstrapModule(moduleType, compilerOptions);
76+
bootstrapModule<M>(moduleType: Type<M>, compilerOptions: CompilerOptions | CompilerOptions[] = []): Promise<NgModuleRef<M>> {
77+
this._bootstrapper = () => this.platform.bootstrapModule(moduleType, compilerOptions);
7878

79-
this.bootstrapApp();
79+
this.bootstrapApp();
80+
81+
return null; //Make the compiler happy
82+
}
8083

81-
return null; //Make the compiler happy
82-
}
84+
private bootstrapApp() {
85+
global.__onLiveSyncCore = () => this.livesyncModule();
8386

84-
private bootstrapApp() {
85-
global.__onLiveSyncCore = () => this.livesyncModule();
87+
const mainPageEntry = this.createNavigationEntry(this._bootstrapper);
8688

87-
const mainPageEntry = this.createNavigationEntry(this._bootstrapper);
89+
application.start(mainPageEntry);
90+
}
8891

89-
application.start(mainPageEntry);
90-
}
92+
livesyncModule(): void {
93+
rendererLog("ANGULAR LiveSync Started");
9194

92-
livesyncModule(): void {
93-
rendererLog("ANGULAR LiveSync Started");
95+
onBeforeLivesync.next(lastBootstrappedModule ? lastBootstrappedModule.get() : null);
9496

95-
onBeforeLivesync.next(lastBootstrappedModule ? lastBootstrappedModule.get() : null);
97+
const mainPageEntry = this.createNavigationEntry(
98+
this._bootstrapper,
99+
compRef => onAfterLivesync.next(compRef),
100+
error => onAfterLivesync.error(error),
101+
true
102+
);
103+
mainPageEntry.animated = false;
104+
mainPageEntry.clearHistory = true;
96105

97-
const mainPageEntry = this.createNavigationEntry(
98-
this._bootstrapper,
99-
compRef => onAfterLivesync.next(compRef),
100-
error => onAfterLivesync.error(error),
101-
true
102-
);
103-
mainPageEntry.animated = false;
104-
mainPageEntry.clearHistory = true;
106+
const frame = topmost();
107+
if (frame) {
108+
if (frame.currentPage && frame.currentPage.modal) {
109+
frame.currentPage.modal.closeModal();
110+
}
111+
frame.navigate(mainPageEntry);
112+
}
113+
}
105114

106-
const frame = topmost();
107-
if (frame) {
108-
if (frame.currentPage && frame.currentPage.modal) {
109-
frame.currentPage.modal.closeModal();
110-
}
111-
frame.navigate(mainPageEntry);
115+
onDestroy(callback: () => void): void {
116+
this.platform.onDestroy(callback);
112117
}
113-
}
114-
115-
onDestroy(callback: () => void): void {
116-
this.platform.onDestroy(callback);
117-
}
118-
119-
get injector(): Injector {
120-
return this.platform.injector;
121-
};
122-
123-
destroy(): void {
124-
this.platform.destroy();
125-
}
126-
127-
get destroyed(): boolean {
128-
return this.platform.destroyed;
129-
}
130-
131-
private createNavigationEntry(
132-
bootstrapAction: BootstrapperAction,
133-
resolve?: (comp: NgModuleRef<any>) => void,
134-
reject?: (e: Error) => void,
135-
isLivesync: boolean = false,
136-
isReboot: boolean = false): NavigationEntry {
137-
138-
const pageFactory: PageFactory = this.platform.injector.get(PAGE_FACTORY);
139-
140-
const navEntry: NavigationEntry = {
141-
create: (): Page => {
142-
let page = pageFactory({ isBootstrap: true, isLivesync });
143-
if (this.appOptions) {
144-
page.actionBarHidden = this.appOptions.startPageActionBarHidden;
145-
}
146118

147-
let onLoadedHandler = function (args) {
148-
page.off('loaded', onLoadedHandler);
149-
//profiling.stop('application-start');
150-
rendererLog('Page loaded');
119+
get injector(): Injector {
120+
return this.platform.injector;
121+
};
151122

152-
//profiling.start('ng-bootstrap');
153-
rendererLog('BOOTSTRAPPING...');
154-
bootstrapAction().then((moduleRef) => {
155-
//profiling.stop('ng-bootstrap');
156-
rendererLog('ANGULAR BOOTSTRAP DONE.');
157-
lastBootstrappedModule = new WeakRef(moduleRef);
123+
destroy(): void {
124+
this.platform.destroy();
125+
}
158126

159-
if (resolve) {
160-
resolve(moduleRef);
161-
}
162-
return moduleRef;
163-
}, (err) => {
164-
rendererError('ERROR BOOTSTRAPPING ANGULAR');
165-
let errorMessage = err.message + "\n\n" + err.stack;
166-
rendererError(errorMessage);
167-
168-
let view = new TextView();
169-
view.text = errorMessage;
170-
page.content = view;
171-
172-
if (reject) {
173-
reject(err);
127+
get destroyed(): boolean {
128+
return this.platform.destroyed;
129+
}
130+
131+
private createNavigationEntry(
132+
bootstrapAction: BootstrapperAction,
133+
resolve?: (comp: NgModuleRef<any>) => void,
134+
reject?: (e: Error) => void,
135+
isLivesync: boolean = false,
136+
isReboot: boolean = false): NavigationEntry {
137+
138+
const pageFactory: PageFactory = this.platform.injector.get(PAGE_FACTORY);
139+
140+
const navEntry: NavigationEntry = {
141+
create: (): Page => {
142+
let page = pageFactory({ isBootstrap: true, isLivesync });
143+
if (this.appOptions) {
144+
page.actionBarHidden = this.appOptions.startPageActionBarHidden;
145+
}
146+
147+
let onLoadedHandler = function (args) {
148+
page.off('loaded', onLoadedHandler);
149+
//profiling.stop('application-start');
150+
rendererLog('Page loaded');
151+
152+
//profiling.start('ng-bootstrap');
153+
rendererLog('BOOTSTRAPPING...');
154+
bootstrapAction().then((moduleRef) => {
155+
//profiling.stop('ng-bootstrap');
156+
rendererLog('ANGULAR BOOTSTRAP DONE.');
157+
lastBootstrappedModule = new WeakRef(moduleRef);
158+
159+
if (resolve) {
160+
resolve(moduleRef);
161+
}
162+
return moduleRef;
163+
}, (err) => {
164+
rendererError('ERROR BOOTSTRAPPING ANGULAR');
165+
let errorMessage = err.message + "\n\n" + err.stack;
166+
rendererError(errorMessage);
167+
168+
let view = new TextView();
169+
view.text = errorMessage;
170+
page.content = view;
171+
172+
if (reject) {
173+
reject(err);
174+
}
175+
});
176+
};
177+
178+
page.on('loaded', onLoadedHandler);
179+
180+
return page;
174181
}
175-
});
176182
};
177183

178-
page.on('loaded', onLoadedHandler);
179-
180-
return page;
181-
}
182-
};
184+
if (isReboot) {
185+
navEntry.animated = false;
186+
navEntry.clearHistory = true;
187+
}
183188

184-
if (isReboot) {
185-
navEntry.animated = false;
186-
navEntry.clearHistory = true;
189+
return navEntry;
187190
}
188191

189-
return navEntry;
190-
}
191-
192-
liveSyncApp() {
193-
}
192+
liveSyncApp() {
193+
}
194194
}

Diff for: nativescript-angular/platform-providers.ts

+9-8
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { topmost, Frame } from 'ui/frame';
22
import { Page } from 'ui/page';
3-
import { OpaqueToken, Type } from '@angular/core';
3+
import { OpaqueToken, NgModuleFactoryLoader } from '@angular/core';
44
import { device, Device } from "platform";
55

66
export const APP_ROOT_VIEW = new OpaqueToken('App Root View');
7-
export const DEVICE = new OpaqueToken('platfrom device');
7+
export const DEVICE = new OpaqueToken('platform device');
88
export const PAGE_FACTORY = new OpaqueToken('page factory');
99

1010
export function getDefaultPage(): Page {
@@ -23,13 +23,14 @@ export const defaultDeviceProvider = { provide: DEVICE, useValue: device };
2323

2424
export type PageFactory = (options: PageFactoryOptions) => Page;
2525
export interface PageFactoryOptions {
26-
isBootstrap?: boolean,
27-
isLivesync?:boolean,
28-
isModal?: boolean,
29-
isNavigation?: boolean,
30-
componentType?: any
26+
isBootstrap?: boolean;
27+
isLivesync?: boolean;
28+
isModal?: boolean;
29+
isNavigation?: boolean;
30+
componentType?: any;
3131
}
3232
export const defaultPageFactory: PageFactory = function (opts: PageFactoryOptions) {
3333
return new Page();
34-
}
34+
};
35+
3536
export const defaultPageFactoryProvider = { provide: PAGE_FACTORY, useValue: defaultPageFactory };

Diff for: nativescript-angular/router.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { NgModule, ModuleWithProviders, NO_ERRORS_SCHEMA } from "@angular/core";
1+
import { NgModule, ModuleWithProviders, NO_ERRORS_SCHEMA, NgModuleFactoryLoader } from "@angular/core";
22
import { RouterModule, Routes, ExtraOptions } from '@angular/router';
33
import { LocationStrategy, PlatformLocation } from '@angular/common';
44
import { NSRouterLink } from './router/ns-router-link';
@@ -11,6 +11,7 @@ export { routerTraceCategory } from "./trace";
1111
export { PageRoute } from './router/page-router-outlet';
1212
export { RouterExtensions } from './router/router-extensions';
1313
import { NativeScriptModule } from "./nativescript.module";
14+
import { NsModuleFactoryLoader } from "./router/ns-module-factory-loader";
1415

1516
@NgModule({
1617
declarations: [
@@ -39,7 +40,14 @@ import { NativeScriptModule } from "./nativescript.module";
3940
})
4041
export class NativeScriptRouterModule {
4142
static forRoot(routes: Routes, config?: ExtraOptions): ModuleWithProviders {
42-
return RouterModule.forRoot(routes, config);
43+
let moduleWithProviders = RouterModule.forRoot(routes, config);
44+
45+
// Override the stock SystemJsNgModuleLoader
46+
moduleWithProviders.providers.push(
47+
{ provide: NgModuleFactoryLoader, useClass: NsModuleFactoryLoader },
48+
);
49+
50+
return moduleWithProviders;
4351
}
4452

4553
static forChild(routes: Routes): ModuleWithProviders {

0 commit comments

Comments
 (0)