@angular/core
Version:
Angular - the core framework
1,141 lines • 95.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: packages/core/src/application_ref.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @license
* Copyright Google Inc. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import './util/ng_jit_mode';
import { merge, Observable } from 'rxjs';
import { share } from 'rxjs/operators';
import { ApplicationInitStatus } from './application_init';
import { APP_BOOTSTRAP_LISTENER, PLATFORM_INITIALIZER } from './application_tokens';
import { getCompilerFacade } from './compiler/compiler_facade';
import { Console } from './console';
import { Injectable, InjectionToken, Injector } from './di';
import { INJECTOR_SCOPE } from './di/scope';
import { ErrorHandler } from './error_handler';
import { DEFAULT_LOCALE_ID } from './i18n/localization';
import { LOCALE_ID } from './i18n/tokens';
import { ivyEnabled } from './ivy_switch';
import { COMPILER_OPTIONS, CompilerFactory } from './linker/compiler';
import { ComponentFactory } from './linker/component_factory';
import { ComponentFactoryBoundToModule, ComponentFactoryResolver } from './linker/component_factory_resolver';
import { NgModuleRef } from './linker/ng_module_factory';
import { isComponentResourceResolutionQueueEmpty, resolveComponentResources } from './metadata/resource_loading';
import { assertNgModuleType } from './render3/assert';
import { setLocaleId } from './render3/i18n';
import { setJitOptions } from './render3/jit/jit_options';
import { NgModuleFactory as R3NgModuleFactory } from './render3/ng_module_ref';
import { publishDefaultGlobalUtils as _publishDefaultGlobalUtils } from './render3/util/global_utils';
import { Testability, TestabilityRegistry } from './testability/testability';
import { isDevMode } from './util/is_dev_mode';
import { isPromise } from './util/lang';
import { scheduleMicroTask } from './util/microtask';
import { stringify } from './util/stringify';
import { NgZone, NoopNgZone } from './zone/ng_zone';
/** @type {?} */
let _platform;
/** @type {?} */
let compileNgModuleFactory = compileNgModuleFactory__PRE_R3__;
/**
* @template M
* @param {?} injector
* @param {?} options
* @param {?} moduleType
* @return {?}
*/
function compileNgModuleFactory__PRE_R3__(injector, options, moduleType) {
/** @type {?} */
const compilerFactory = injector.get(CompilerFactory);
/** @type {?} */
const compiler = compilerFactory.createCompiler([options]);
return compiler.compileModuleAsync(moduleType);
}
/**
* @template M
* @param {?} injector
* @param {?} options
* @param {?} moduleType
* @return {?}
*/
export function compileNgModuleFactory__POST_R3__(injector, options, moduleType) {
ngDevMode && assertNgModuleType(moduleType);
/** @type {?} */
const compilerOptions = injector.get(COMPILER_OPTIONS, []).concat(options);
if (typeof ngJitMode === 'undefined' || ngJitMode) {
// Configure the compiler to use the provided options. This call may fail when multiple modules
// are bootstrapped with incompatible options, as a component can only be compiled according to
// a single set of options.
setJitOptions({
defaultEncapsulation: _lastDefined(compilerOptions.map((/**
* @param {?} options
* @return {?}
*/
options => options.defaultEncapsulation))),
preserveWhitespaces: _lastDefined(compilerOptions.map((/**
* @param {?} options
* @return {?}
*/
options => options.preserveWhitespaces))),
});
}
/** @type {?} */
const moduleFactory = new R3NgModuleFactory(moduleType);
if (isComponentResourceResolutionQueueEmpty()) {
return Promise.resolve(moduleFactory);
}
/** @type {?} */
const compilerProviders = _mergeArrays(compilerOptions.map((/**
* @param {?} o
* @return {?}
*/
o => (/** @type {?} */ (o.providers)))));
// In case there are no compiler providers, we just return the module factory as
// there won't be any resource loader. This can happen with Ivy, because AOT compiled
// modules can be still passed through "bootstrapModule". In that case we shouldn't
// unnecessarily require the JIT compiler.
if (compilerProviders.length === 0) {
return Promise.resolve(moduleFactory);
}
/** @type {?} */
const compiler = getCompilerFacade();
/** @type {?} */
const compilerInjector = Injector.create({ providers: compilerProviders });
/** @type {?} */
const resourceLoader = compilerInjector.get(compiler.ResourceLoader);
// The resource loader can also return a string while the "resolveComponentResources"
// always expects a promise. Therefore we need to wrap the returned value in a promise.
return resolveComponentResources((/**
* @param {?} url
* @return {?}
*/
url => Promise.resolve(resourceLoader.get(url))))
.then((/**
* @return {?}
*/
() => moduleFactory));
}
// the `window.ng` global utilities are only available in non-VE versions of
// Angular. The function switch below will make sure that the code is not
// included into Angular when PRE mode is active.
/**
* @return {?}
*/
export function publishDefaultGlobalUtils__PRE_R3__() { }
/**
* @return {?}
*/
export function publishDefaultGlobalUtils__POST_R3__() {
ngDevMode && _publishDefaultGlobalUtils();
}
/** @type {?} */
let publishDefaultGlobalUtils = publishDefaultGlobalUtils__PRE_R3__;
/** @type {?} */
let isBoundToModule = isBoundToModule__PRE_R3__;
/**
* @template C
* @param {?} cf
* @return {?}
*/
export function isBoundToModule__PRE_R3__(cf) {
return cf instanceof ComponentFactoryBoundToModule;
}
/**
* @template C
* @param {?} cf
* @return {?}
*/
export function isBoundToModule__POST_R3__(cf) {
return ((/** @type {?} */ (cf))).isBoundToModule;
}
/** @type {?} */
export const ALLOW_MULTIPLE_PLATFORMS = new InjectionToken('AllowMultipleToken');
/**
* A token for third-party components that can register themselves with NgProbe.
*
* \@publicApi
*/
export class NgProbeToken {
/**
* @param {?} name
* @param {?} token
*/
constructor(name, token) {
this.name = name;
this.token = token;
}
}
if (false) {
/** @type {?} */
NgProbeToken.prototype.name;
/** @type {?} */
NgProbeToken.prototype.token;
}
/**
* Creates a platform.
* Platforms have to be eagerly created via this function.
*
* \@publicApi
* @param {?} injector
* @return {?}
*/
export function createPlatform(injector) {
if (_platform && !_platform.destroyed &&
!_platform.injector.get(ALLOW_MULTIPLE_PLATFORMS, false)) {
throw new Error('There can be only one platform. Destroy the previous one to create a new one.');
}
publishDefaultGlobalUtils();
_platform = injector.get(PlatformRef);
/** @type {?} */
const inits = injector.get(PLATFORM_INITIALIZER, null);
if (inits)
inits.forEach((/**
* @param {?} init
* @return {?}
*/
(init) => init()));
return _platform;
}
/**
* Creates a factory for a platform
*
* \@publicApi
* @param {?} parentPlatformFactory
* @param {?} name
* @param {?=} providers
* @return {?}
*/
export function createPlatformFactory(parentPlatformFactory, name, providers = []) {
/** @type {?} */
const desc = `Platform: ${name}`;
/** @type {?} */
const marker = new InjectionToken(desc);
return (/**
* @param {?=} extraProviders
* @return {?}
*/
(extraProviders = []) => {
/** @type {?} */
let platform = getPlatform();
if (!platform || platform.injector.get(ALLOW_MULTIPLE_PLATFORMS, false)) {
if (parentPlatformFactory) {
parentPlatformFactory(providers.concat(extraProviders).concat({ provide: marker, useValue: true }));
}
else {
/** @type {?} */
const injectedProviders = providers.concat(extraProviders).concat({ provide: marker, useValue: true }, {
provide: INJECTOR_SCOPE,
useValue: 'platform'
});
createPlatform(Injector.create({ providers: injectedProviders, name: desc }));
}
}
return assertPlatform(marker);
});
}
/**
* Checks that there currently is a platform which contains the given token as a provider.
*
* \@publicApi
* @param {?} requiredToken
* @return {?}
*/
export function assertPlatform(requiredToken) {
/** @type {?} */
const platform = getPlatform();
if (!platform) {
throw new Error('No platform exists!');
}
if (!platform.injector.get(requiredToken, null)) {
throw new Error('A platform with a different configuration has been created. Please destroy it first.');
}
return platform;
}
/**
* Destroy the existing platform.
*
* \@publicApi
* @return {?}
*/
export function destroyPlatform() {
if (_platform && !_platform.destroyed) {
_platform.destroy();
}
}
/**
* Returns the current platform.
*
* \@publicApi
* @return {?}
*/
export function getPlatform() {
return _platform && !_platform.destroyed ? _platform : null;
}
/**
* Provides additional options to the bootstraping process.
*
*
* @record
*/
export function BootstrapOptions() { }
if (false) {
/**
* Optionally specify which `NgZone` should be used.
*
* - Provide your own `NgZone` instance.
* - `zone.js` - Use default `NgZone` which requires `Zone.js`.
* - `noop` - Use `NoopNgZone` which does nothing.
* @type {?|undefined}
*/
BootstrapOptions.prototype.ngZone;
/**
* Optionally specify coalescing event change detections or not.
* Consider the following case.
*
* <div (click)="doSomething()">
* <button (click)="doSomethingElse()"></button>
* </div>
*
* When button is clicked, because of the event bubbling, both
* event handlers will be called and 2 change detections will be
* triggered. We can colesce such kind of events to only trigger
* change detection only once.
*
* By default, this option will be false. So the events will not be
* coalesced and the change detection will be triggered multiple times.
* And if this option be set to true, the change detection will be
* triggered async by scheduling a animation frame. So in the case above,
* the change detection will only be trigged once.
* @type {?|undefined}
*/
BootstrapOptions.prototype.ngZoneEventCoalescing;
}
/**
* The Angular platform is the entry point for Angular on a web page. Each page
* has exactly one platform, and services (such as reflection) which are common
* to every Angular application running on the page are bound in its scope.
*
* A page's platform is initialized implicitly when a platform is created via a platform factory
* (e.g. {\@link platformBrowser}), or explicitly by calling the {\@link createPlatform} function.
*
* \@publicApi
*/
export class PlatformRef {
/**
* \@internal
* @param {?} _injector
*/
constructor(_injector) {
this._injector = _injector;
this._modules = [];
this._destroyListeners = [];
this._destroyed = false;
}
/**
* Creates an instance of an `\@NgModule` for the given platform
* for offline compilation.
*
* \@usageNotes
* ### Simple Example
*
* ```typescript
* my_module.ts:
*
* \@NgModule({
* imports: [BrowserModule]
* })
* class MyModule {}
*
* main.ts:
* import {MyModuleNgFactory} from './my_module.ngfactory';
* import {platformBrowser} from '\@angular/platform-browser';
*
* let moduleRef = platformBrowser().bootstrapModuleFactory(MyModuleNgFactory);
* ```
* @template M
* @param {?} moduleFactory
* @param {?=} options
* @return {?}
*/
bootstrapModuleFactory(moduleFactory, options) {
// Note: We need to create the NgZone _before_ we instantiate the module,
// as instantiating the module creates some providers eagerly.
// So we create a mini parent injector that just contains the new NgZone and
// pass that as parent to the NgModuleFactory.
/** @type {?} */
const ngZoneOption = options ? options.ngZone : undefined;
/** @type {?} */
const ngZoneEventCoalescing = (options && options.ngZoneEventCoalescing) || false;
/** @type {?} */
const ngZone = getNgZone(ngZoneOption, ngZoneEventCoalescing);
/** @type {?} */
const providers = [{ provide: NgZone, useValue: ngZone }];
// Attention: Don't use ApplicationRef.run here,
// as we want to be sure that all possible constructor calls are inside `ngZone.run`!
return ngZone.run((/**
* @return {?}
*/
() => {
/** @type {?} */
const ngZoneInjector = Injector.create({ providers: providers, parent: this.injector, name: moduleFactory.moduleType.name });
/** @type {?} */
const moduleRef = (/** @type {?} */ (moduleFactory.create(ngZoneInjector)));
/** @type {?} */
const exceptionHandler = moduleRef.injector.get(ErrorHandler, null);
if (!exceptionHandler) {
throw new Error('No ErrorHandler. Is platform module (BrowserModule) included?');
}
moduleRef.onDestroy((/**
* @return {?}
*/
() => remove(this._modules, moduleRef)));
(/** @type {?} */ (ngZone)).runOutsideAngular((/**
* @return {?}
*/
() => (/** @type {?} */ (ngZone)).onError.subscribe({
next: (/**
* @param {?} error
* @return {?}
*/
(error) => {
exceptionHandler.handleError(error);
})
})));
return _callAndReportToErrorHandler(exceptionHandler, (/** @type {?} */ (ngZone)), (/**
* @return {?}
*/
() => {
/** @type {?} */
const initStatus = moduleRef.injector.get(ApplicationInitStatus);
initStatus.runInitializers();
return initStatus.donePromise.then((/**
* @return {?}
*/
() => {
if (ivyEnabled) {
// If the `LOCALE_ID` provider is defined at bootstrap then we set the value for ivy
/** @type {?} */
const localeId = moduleRef.injector.get(LOCALE_ID, DEFAULT_LOCALE_ID);
setLocaleId(localeId || DEFAULT_LOCALE_ID);
}
this._moduleDoBootstrap(moduleRef);
return moduleRef;
}));
}));
}));
}
/**
* Creates an instance of an `\@NgModule` for a given platform using the given runtime compiler.
*
* \@usageNotes
* ### Simple Example
*
* ```typescript
* \@NgModule({
* imports: [BrowserModule]
* })
* class MyModule {}
*
* let moduleRef = platformBrowser().bootstrapModule(MyModule);
* ```
*
* @template M
* @param {?} moduleType
* @param {?=} compilerOptions
* @return {?}
*/
bootstrapModule(moduleType, compilerOptions = []) {
/** @type {?} */
const options = optionsReducer({}, compilerOptions);
return compileNgModuleFactory(this.injector, options, moduleType)
.then((/**
* @param {?} moduleFactory
* @return {?}
*/
moduleFactory => this.bootstrapModuleFactory(moduleFactory, options)));
}
/**
* @private
* @param {?} moduleRef
* @return {?}
*/
_moduleDoBootstrap(moduleRef) {
/** @type {?} */
const appRef = (/** @type {?} */ (moduleRef.injector.get(ApplicationRef)));
if (moduleRef._bootstrapComponents.length > 0) {
moduleRef._bootstrapComponents.forEach((/**
* @param {?} f
* @return {?}
*/
f => appRef.bootstrap(f)));
}
else if (moduleRef.instance.ngDoBootstrap) {
moduleRef.instance.ngDoBootstrap(appRef);
}
else {
throw new Error(`The module ${stringify(moduleRef.instance
.constructor)} was bootstrapped, but it does not declare "@NgModule.bootstrap" components nor a "ngDoBootstrap" method. ` +
`Please define one of these.`);
}
this._modules.push(moduleRef);
}
/**
* Register a listener to be called when the platform is disposed.
* @param {?} callback
* @return {?}
*/
onDestroy(callback) {
this._destroyListeners.push(callback);
}
/**
* Retrieve the platform {\@link Injector}, which is the parent injector for
* every Angular application on the page and provides singleton providers.
* @return {?}
*/
get injector() {
return this._injector;
}
/**
* Destroy the Angular platform and all Angular applications on the page.
* @return {?}
*/
destroy() {
if (this._destroyed) {
throw new Error('The platform has already been destroyed!');
}
this._modules.slice().forEach((/**
* @param {?} module
* @return {?}
*/
module => module.destroy()));
this._destroyListeners.forEach((/**
* @param {?} listener
* @return {?}
*/
listener => listener()));
this._destroyed = true;
}
/**
* @return {?}
*/
get destroyed() {
return this._destroyed;
}
}
PlatformRef.decorators = [
{ type: Injectable }
];
/** @nocollapse */
PlatformRef.ctorParameters = () => [
{ type: Injector }
];
if (false) {
/**
* @type {?}
* @private
*/
PlatformRef.prototype._modules;
/**
* @type {?}
* @private
*/
PlatformRef.prototype._destroyListeners;
/**
* @type {?}
* @private
*/
PlatformRef.prototype._destroyed;
/**
* @type {?}
* @private
*/
PlatformRef.prototype._injector;
}
/**
* @param {?} ngZoneOption
* @param {?} ngZoneEventCoalescing
* @return {?}
*/
function getNgZone(ngZoneOption, ngZoneEventCoalescing) {
/** @type {?} */
let ngZone;
if (ngZoneOption === 'noop') {
ngZone = new NoopNgZone();
}
else {
ngZone = (ngZoneOption === 'zone.js' ? undefined : ngZoneOption) || new NgZone({
enableLongStackTrace: isDevMode(),
shouldCoalesceEventChangeDetection: ngZoneEventCoalescing
});
}
return ngZone;
}
/**
* @param {?} errorHandler
* @param {?} ngZone
* @param {?} callback
* @return {?}
*/
function _callAndReportToErrorHandler(errorHandler, ngZone, callback) {
try {
/** @type {?} */
const result = callback();
if (isPromise(result)) {
return result.catch((/**
* @param {?} e
* @return {?}
*/
(e) => {
ngZone.runOutsideAngular((/**
* @return {?}
*/
() => errorHandler.handleError(e)));
// rethrow as the exception handler might not do it
throw e;
}));
}
return result;
}
catch (e) {
ngZone.runOutsideAngular((/**
* @return {?}
*/
() => errorHandler.handleError(e)));
// rethrow as the exception handler might not do it
throw e;
}
}
/**
* @template T
* @param {?} dst
* @param {?} objs
* @return {?}
*/
function optionsReducer(dst, objs) {
if (Array.isArray(objs)) {
dst = objs.reduce(optionsReducer, dst);
}
else {
dst = Object.assign(Object.assign({}, dst), ((/** @type {?} */ (objs))));
}
return dst;
}
/**
* A reference to an Angular application running on a page.
*
* \@usageNotes
*
* {\@a is-stable-examples}
* ### isStable examples and caveats
*
* Note two important points about `isStable`, demonstrated in the examples below:
* - the application will never be stable if you start any kind
* of recurrent asynchronous task when the application starts
* (for example for a polling process, started with a `setInterval`, a `setTimeout`
* or using RxJS operators like `interval`);
* - the `isStable` Observable runs outside of the Angular zone.
*
* Let's imagine that you start a recurrent task
* (here incrementing a counter, using RxJS `interval`),
* and at the same time subscribe to `isStable`.
*
* ```
* constructor(appRef: ApplicationRef) {
* appRef.isStable.pipe(
* filter(stable => stable)
* ).subscribe(() => console.log('App is stable now');
* interval(1000).subscribe(counter => console.log(counter));
* }
* ```
* In this example, `isStable` will never emit `true`,
* and the trace "App is stable now" will never get logged.
*
* If you want to execute something when the app is stable,
* you have to wait for the application to be stable
* before starting your polling process.
*
* ```
* constructor(appRef: ApplicationRef) {
* appRef.isStable.pipe(
* first(stable => stable),
* tap(stable => console.log('App is stable now')),
* switchMap(() => interval(1000))
* ).subscribe(counter => console.log(counter));
* }
* ```
* In this example, the trace "App is stable now" will be logged
* and then the counter starts incrementing every second.
*
* Note also that this Observable runs outside of the Angular zone,
* which means that the code in the subscription
* to this Observable will not trigger the change detection.
*
* Let's imagine that instead of logging the counter value,
* you update a field of your component
* and display it in its template.
*
* ```
* constructor(appRef: ApplicationRef) {
* appRef.isStable.pipe(
* first(stable => stable),
* switchMap(() => interval(1000))
* ).subscribe(counter => this.value = counter);
* }
* ```
* As the `isStable` Observable runs outside the zone,
* the `value` field will be updated properly,
* but the template will not be refreshed!
*
* You'll have to manually trigger the change detection to update the template.
*
* ```
* constructor(appRef: ApplicationRef, cd: ChangeDetectorRef) {
* appRef.isStable.pipe(
* first(stable => stable),
* switchMap(() => interval(1000))
* ).subscribe(counter => {
* this.value = counter;
* cd.detectChanges();
* });
* }
* ```
*
* Or make the subscription callback run inside the zone.
*
* ```
* constructor(appRef: ApplicationRef, zone: NgZone) {
* appRef.isStable.pipe(
* first(stable => stable),
* switchMap(() => interval(1000))
* ).subscribe(counter => zone.run(() => this.value = counter));
* }
* ```
*
* \@publicApi
*/
export class ApplicationRef {
/**
* \@internal
* @param {?} _zone
* @param {?} _console
* @param {?} _injector
* @param {?} _exceptionHandler
* @param {?} _componentFactoryResolver
* @param {?} _initStatus
*/
constructor(_zone, _console, _injector, _exceptionHandler, _componentFactoryResolver, _initStatus) {
this._zone = _zone;
this._console = _console;
this._injector = _injector;
this._exceptionHandler = _exceptionHandler;
this._componentFactoryResolver = _componentFactoryResolver;
this._initStatus = _initStatus;
/**
* \@internal
*/
this._bootstrapListeners = [];
this._views = [];
this._runningTick = false;
this._enforceNoNewChanges = false;
this._stable = true;
/**
* Get a list of component types registered to this application.
* This list is populated even before the component is created.
*/
this.componentTypes = [];
/**
* Get a list of components registered to this application.
*/
this.components = [];
this._enforceNoNewChanges = isDevMode();
this._zone.onMicrotaskEmpty.subscribe({
next: (/**
* @return {?}
*/
() => {
this._zone.run((/**
* @return {?}
*/
() => {
this.tick();
}));
})
});
/** @type {?} */
const isCurrentlyStable = new Observable((/**
* @param {?} observer
* @return {?}
*/
(observer) => {
this._stable = this._zone.isStable && !this._zone.hasPendingMacrotasks &&
!this._zone.hasPendingMicrotasks;
this._zone.runOutsideAngular((/**
* @return {?}
*/
() => {
observer.next(this._stable);
observer.complete();
}));
}));
/** @type {?} */
const isStable = new Observable((/**
* @param {?} observer
* @return {?}
*/
(observer) => {
// Create the subscription to onStable outside the Angular Zone so that
// the callback is run outside the Angular Zone.
/** @type {?} */
let stableSub;
this._zone.runOutsideAngular((/**
* @return {?}
*/
() => {
stableSub = this._zone.onStable.subscribe((/**
* @return {?}
*/
() => {
NgZone.assertNotInAngularZone();
// Check whether there are no pending macro/micro tasks in the next tick
// to allow for NgZone to update the state.
scheduleMicroTask((/**
* @return {?}
*/
() => {
if (!this._stable && !this._zone.hasPendingMacrotasks &&
!this._zone.hasPendingMicrotasks) {
this._stable = true;
observer.next(true);
}
}));
}));
}));
/** @type {?} */
const unstableSub = this._zone.onUnstable.subscribe((/**
* @return {?}
*/
() => {
NgZone.assertInAngularZone();
if (this._stable) {
this._stable = false;
this._zone.runOutsideAngular((/**
* @return {?}
*/
() => {
observer.next(false);
}));
}
}));
return (/**
* @return {?}
*/
() => {
stableSub.unsubscribe();
unstableSub.unsubscribe();
});
}));
((/** @type {?} */ (this))).isStable =
merge(isCurrentlyStable, isStable.pipe(share()));
}
/**
* Bootstrap a new component at the root level of the application.
*
* \@usageNotes
* ### Bootstrap process
*
* When bootstrapping a new root component into an application, Angular mounts the
* specified application component onto DOM elements identified by the componentType's
* selector and kicks off automatic change detection to finish initializing the component.
*
* Optionally, a component can be mounted onto a DOM element that does not match the
* componentType's selector.
*
* ### Example
* {\@example core/ts/platform/platform.ts region='longform'}
* @template C
* @param {?} componentOrFactory
* @param {?=} rootSelectorOrNode
* @return {?}
*/
bootstrap(componentOrFactory, rootSelectorOrNode) {
if (!this._initStatus.done) {
throw new Error('Cannot bootstrap as there are still asynchronous initializers running. Bootstrap components in the `ngDoBootstrap` method of the root module.');
}
/** @type {?} */
let componentFactory;
if (componentOrFactory instanceof ComponentFactory) {
componentFactory = componentOrFactory;
}
else {
componentFactory =
(/** @type {?} */ (this._componentFactoryResolver.resolveComponentFactory(componentOrFactory)));
}
this.componentTypes.push(componentFactory.componentType);
// Create a factory associated with the current module if it's not bound to some other
/** @type {?} */
const ngModule = isBoundToModule(componentFactory) ? undefined : this._injector.get(NgModuleRef);
/** @type {?} */
const selectorOrNode = rootSelectorOrNode || componentFactory.selector;
/** @type {?} */
const compRef = componentFactory.create(Injector.NULL, [], selectorOrNode, ngModule);
compRef.onDestroy((/**
* @return {?}
*/
() => {
this._unloadComponent(compRef);
}));
/** @type {?} */
const testability = compRef.injector.get(Testability, null);
if (testability) {
compRef.injector.get(TestabilityRegistry)
.registerApplication(compRef.location.nativeElement, testability);
}
this._loadComponent(compRef);
if (isDevMode()) {
this._console.log(`Angular is running in the development mode. Call enableProdMode() to enable the production mode.`);
}
return compRef;
}
/**
* Invoke this method to explicitly process change detection and its side-effects.
*
* In development mode, `tick()` also performs a second change detection cycle to ensure that no
* further changes are detected. If additional changes are picked up during this second cycle,
* bindings in the app have side-effects that cannot be resolved in a single change detection
* pass.
* In this case, Angular throws an error, since an Angular application can only have one change
* detection pass during which all change detection must complete.
* @return {?}
*/
tick() {
if (this._runningTick) {
throw new Error('ApplicationRef.tick is called recursively');
}
try {
this._runningTick = true;
for (let view of this._views) {
view.detectChanges();
}
if (this._enforceNoNewChanges) {
for (let view of this._views) {
view.checkNoChanges();
}
}
}
catch (e) {
// Attention: Don't rethrow as it could cancel subscriptions to Observables!
this._zone.runOutsideAngular((/**
* @return {?}
*/
() => this._exceptionHandler.handleError(e)));
}
finally {
this._runningTick = false;
}
}
/**
* Attaches a view so that it will be dirty checked.
* The view will be automatically detached when it is destroyed.
* This will throw if the view is already attached to a ViewContainer.
* @param {?} viewRef
* @return {?}
*/
attachView(viewRef) {
/** @type {?} */
const view = ((/** @type {?} */ (viewRef)));
this._views.push(view);
view.attachToAppRef(this);
}
/**
* Detaches a view from dirty checking again.
* @param {?} viewRef
* @return {?}
*/
detachView(viewRef) {
/** @type {?} */
const view = ((/** @type {?} */ (viewRef)));
remove(this._views, view);
view.detachFromAppRef();
}
/**
* @private
* @param {?} componentRef
* @return {?}
*/
_loadComponent(componentRef) {
this.attachView(componentRef.hostView);
this.tick();
this.components.push(componentRef);
// Get the listeners lazily to prevent DI cycles.
/** @type {?} */
const listeners = this._injector.get(APP_BOOTSTRAP_LISTENER, []).concat(this._bootstrapListeners);
listeners.forEach((/**
* @param {?} listener
* @return {?}
*/
(listener) => listener(componentRef)));
}
/**
* @private
* @param {?} componentRef
* @return {?}
*/
_unloadComponent(componentRef) {
this.detachView(componentRef.hostView);
remove(this.components, componentRef);
}
/**
* \@internal
* @return {?}
*/
ngOnDestroy() {
// TODO(alxhub): Dispose of the NgZone.
this._views.slice().forEach((/**
* @param {?} view
* @return {?}
*/
(view) => view.destroy()));
}
/**
* Returns the number of attached views.
* @return {?}
*/
get viewCount() {
return this._views.length;
}
}
ApplicationRef.decorators = [
{ type: Injectable }
];
/** @nocollapse */
ApplicationRef.ctorParameters = () => [
{ type: NgZone },
{ type: Console },
{ type: Injector },
{ type: ErrorHandler },
{ type: ComponentFactoryResolver },
{ type: ApplicationInitStatus }
];
if (false) {
/**
* \@internal
* @type {?}
* @private
*/
ApplicationRef.prototype._bootstrapListeners;
/**
* @type {?}
* @private
*/
ApplicationRef.prototype._views;
/**
* @type {?}
* @private
*/
ApplicationRef.prototype._runningTick;
/**
* @type {?}
* @private
*/
ApplicationRef.prototype._enforceNoNewChanges;
/**
* @type {?}
* @private
*/
ApplicationRef.prototype._stable;
/**
* Get a list of component types registered to this application.
* This list is populated even before the component is created.
* @type {?}
*/
ApplicationRef.prototype.componentTypes;
/**
* Get a list of components registered to this application.
* @type {?}
*/
ApplicationRef.prototype.components;
/**
* Returns an Observable that indicates when the application is stable or unstable.
*
* @see [Usage notes](#is-stable-examples) for examples and caveats when using this API.
* @type {?}
*/
ApplicationRef.prototype.isStable;
/**
* @type {?}
* @private
*/
ApplicationRef.prototype._zone;
/**
* @type {?}
* @private
*/
ApplicationRef.prototype._console;
/**
* @type {?}
* @private
*/
ApplicationRef.prototype._injector;
/**
* @type {?}
* @private
*/
ApplicationRef.prototype._exceptionHandler;
/**
* @type {?}
* @private
*/
ApplicationRef.prototype._componentFactoryResolver;
/**
* @type {?}
* @private
*/
ApplicationRef.prototype._initStatus;
}
/**
* @template T
* @param {?} list
* @param {?} el
* @return {?}
*/
function remove(list, el) {
/** @type {?} */
const index = list.indexOf(el);
if (index > -1) {
list.splice(index, 1);
}
}
/**
* @template T
* @param {?} args
* @return {?}
*/
function _lastDefined(args) {
for (let i = args.length - 1; i >= 0; i--) {
if (args[i] !== undefined) {
return args[i];
}
}
return undefined;
}
/**
* @param {?} parts
* @return {?}
*/
function _mergeArrays(parts) {
/** @type {?} */
const result = [];
parts.forEach((/**
* @param {?} part
* @return {?}
*/
(part) => part && result.push(...part)));
return result;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbGljYXRpb25fcmVmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvYXBwbGljYXRpb25fcmVmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQVFBLE9BQU8sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUFDLEtBQUssRUFBRSxVQUFVLEVBQXlCLE1BQU0sTUFBTSxDQUFDO0FBQy9ELE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyQyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RCxPQUFPLEVBQUMsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBaUIsTUFBTSxNQUFNLENBQUM7QUFDMUUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMxQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV4QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxlQUFlLEVBQWtCLE1BQU0sbUJBQW1CLENBQUM7QUFDckYsT0FBTyxFQUFDLGdCQUFnQixFQUFlLE1BQU0sNEJBQTRCLENBQUM7QUFDMUUsT0FBTyxFQUFDLDZCQUE2QixFQUFFLHdCQUF3QixFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFD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