refactor(core): type ComponentRef, ComponentFactory and ComponentFixture by the component type

BREAKING CHANGE:
- `ComponetRef`, `ComponentFactory`, `ComponentFixture` now all require a type
  parameter with the component type.
Closes #8361
This commit is contained in:
Tobias Bosch 2016-04-30 10:52:04 -07:00
parent 4e2c68354e
commit 6a0cbb8a57
48 changed files with 225 additions and 209 deletions

View File

@ -121,7 +121,7 @@ export function browserPlatform(): PlatformRef {
*/ */
export function bootstrap( export function bootstrap(
appComponentType: Type, appComponentType: Type,
customProviders?: Array<any /*Type | Provider | any[]*/>): Promise<ComponentRef> { customProviders?: Array<any /*Type | Provider | any[]*/>): Promise<ComponentRef<any>> {
reflector.reflectionCapabilities = new ReflectionCapabilities(); reflector.reflectionCapabilities = new ReflectionCapabilities();
var appInjector = ReflectiveInjector.resolveAndCreate( var appInjector = ReflectiveInjector.resolveAndCreate(
[BROWSER_APP_PROVIDERS, isPresent(customProviders) ? customProviders : []], [BROWSER_APP_PROVIDERS, isPresent(customProviders) ? customProviders : []],

View File

@ -47,7 +47,7 @@ export function browserStaticPlatform(): PlatformRef {
*/ */
export function bootstrapStatic(appComponentType: Type, export function bootstrapStatic(appComponentType: Type,
customProviders?: Array<any /*Type | Provider | any[]*/>, customProviders?: Array<any /*Type | Provider | any[]*/>,
initReflector?: Function): Promise<ComponentRef> { initReflector?: Function): Promise<ComponentRef<any>> {
if (isPresent(initReflector)) { if (isPresent(initReflector)) {
initReflector(); initReflector();
} }

View File

@ -39,7 +39,7 @@ PlatformRef workerAppPlatform(SendPort renderSendPort) {
return platform; return platform;
} }
Future<ComponentRef> bootstrapApp( Future<ComponentRef<dynamic>> bootstrapApp(
SendPort renderSendPort, SendPort renderSendPort,
Type appComponentType, Type appComponentType,
[List<dynamic /*Type | Provider | any[]*/> customProviders]) { [List<dynamic /*Type | Provider | any[]*/> customProviders]) {

View File

@ -44,7 +44,7 @@ export function workerAppPlatform(): PlatformRef {
export function bootstrapApp( export function bootstrapApp(
appComponentType: Type, appComponentType: Type,
customProviders?: Array<any /*Type | Provider | any[]*/>): Promise<ComponentRef> { customProviders?: Array<any /*Type | Provider | any[]*/>): Promise<ComponentRef<any>> {
var appInjector = ReflectiveInjector.resolveAndCreate( var appInjector = ReflectiveInjector.resolveAndCreate(
[WORKER_APP_APPLICATION, isPresent(customProviders) ? customProviders : []], [WORKER_APP_APPLICATION, isPresent(customProviders) ? customProviders : []],
workerAppPlatform().injector); workerAppPlatform().injector);

View File

@ -15,7 +15,7 @@ import {isPresent, isBlank} from 'angular2/src/facade/lang';
@Directive({selector: 'router-outlet'}) @Directive({selector: 'router-outlet'})
export class RouterOutlet { export class RouterOutlet {
private _loaded: ComponentRef; private _loaded: ComponentRef<any>;
public outletMap: RouterOutletMap; public outletMap: RouterOutletMap;
constructor(parentOutletMap: RouterOutletMap, private _location: ViewContainerRef, constructor(parentOutletMap: RouterOutletMap, private _location: ViewContainerRef,
@ -32,8 +32,8 @@ export class RouterOutlet {
get isLoaded(): boolean { return isPresent(this._loaded); } get isLoaded(): boolean { return isPresent(this._loaded); }
load(factory: ComponentFactory, providers: ResolvedReflectiveProvider[], load(factory: ComponentFactory<any>, providers: ResolvedReflectiveProvider[],
outletMap: RouterOutletMap): ComponentRef { outletMap: RouterOutletMap): ComponentRef<any> {
this.outletMap = outletMap; this.outletMap = outletMap;
let inj = ReflectiveInjector.fromResolvedProviders(providers, this._location.parentInjector); let inj = ReflectiveInjector.fromResolvedProviders(providers, this._location.parentInjector);
this._loaded = this._location.createComponent(factory, this._location.length, inj, []); this._loaded = this._location.createComponent(factory, this._location.length, inj, []);

View File

@ -86,10 +86,10 @@ export class RouteSegment {
_type: Type; _type: Type;
/** @internal */ /** @internal */
_componentFactory: ComponentFactory; _componentFactory: ComponentFactory<any>;
constructor(public urlSegments: UrlSegment[], public parameters: {[key: string]: string}, constructor(public urlSegments: UrlSegment[], public parameters: {[key: string]: string},
public outlet: string, type: Type, componentFactory: ComponentFactory) { public outlet: string, type: Type, componentFactory: ComponentFactory<any>) {
this._type = type; this._type = type;
this._componentFactory = componentFactory; this._componentFactory = componentFactory;
} }
@ -123,6 +123,6 @@ export function equalSegments(a: RouteSegment, b: RouteSegment): boolean {
return StringMapWrapper.equals(a.parameters, b.parameters); return StringMapWrapper.equals(a.parameters, b.parameters);
} }
export function routeSegmentComponentFactory(a: RouteSegment): ComponentFactory { export function routeSegmentComponentFactory(a: RouteSegment): ComponentFactory<any> {
return a._componentFactory; return a._componentFactory;
} }

View File

@ -61,16 +61,17 @@ export class OfflineCompiler {
var hostMeta = createHostComponentMeta(compMeta.type, compMeta.selector); var hostMeta = createHostComponentMeta(compMeta.type, compMeta.selector);
var hostViewFactoryVar = this._compileComponent(hostMeta, [compMeta], [], statements); var hostViewFactoryVar = this._compileComponent(hostMeta, [compMeta], [], statements);
var compFactoryVar = `${compMeta.type.name}NgFactory`; var compFactoryVar = `${compMeta.type.name}NgFactory`;
statements.push(o.variable(compFactoryVar) statements.push(
.set(o.importExpr(_COMPONENT_FACTORY_IDENTIFIER) o.variable(compFactoryVar)
.set(o.importExpr(_COMPONENT_FACTORY_IDENTIFIER, [o.importType(compMeta.type)])
.instantiate( .instantiate(
[ [
o.literal(compMeta.selector), o.literal(compMeta.selector),
o.variable(hostViewFactoryVar), o.variable(hostViewFactoryVar),
o.importExpr(compMeta.type) o.importExpr(compMeta.type)
], ],
o.importType(_COMPONENT_FACTORY_IDENTIFIER, null, o.importType(_COMPONENT_FACTORY_IDENTIFIER,
[o.TypeModifier.Const]))) [o.importType(compMeta.type)], [o.TypeModifier.Const])))
.toDeclStmt(null, [o.StmtModifier.Final])); .toDeclStmt(null, [o.StmtModifier.Final]));
exportedVars.push(compFactoryVar); exportedVars.push(compFactoryVar);
}); });

View File

@ -77,7 +77,7 @@ export class RuntimeCompiler implements ComponentResolver {
private _viewCompiler: ViewCompiler, private _xhr: XHR, private _viewCompiler: ViewCompiler, private _xhr: XHR,
private _genConfig: CompilerConfig) {} private _genConfig: CompilerConfig) {}
resolveComponent(componentType: Type): Promise<ComponentFactory> { resolveComponent(componentType: Type): Promise<ComponentFactory<any>> {
var compMeta: CompileDirectiveMetadata = var compMeta: CompileDirectiveMetadata =
this._metadataResolver.getDirectiveMetadata(componentType); this._metadataResolver.getDirectiveMetadata(componentType);
var hostCacheKey = this._hostCacheKeys.get(componentType); var hostCacheKey = this._hostCacheKeys.get(componentType);

View File

@ -94,8 +94,8 @@ export function getPlatform(): PlatformRef {
* Shortcut for ApplicationRef.bootstrap. * Shortcut for ApplicationRef.bootstrap.
* Requires a platform the be created first. * Requires a platform the be created first.
*/ */
export function coreBootstrap(injector: Injector, export function coreBootstrap<C>(injector: Injector,
componentFactory: ComponentFactory): ComponentRef { componentFactory: ComponentFactory<C>): ComponentRef<C> {
var appRef: ApplicationRef = injector.get(ApplicationRef); var appRef: ApplicationRef = injector.get(ApplicationRef);
return appRef.bootstrap(componentFactory); return appRef.bootstrap(componentFactory);
} }
@ -106,7 +106,7 @@ export function coreBootstrap(injector: Injector,
* Requires a platform the be created first. * Requires a platform the be created first.
*/ */
export function coreLoadAndBootstrap(injector: Injector, export function coreLoadAndBootstrap(injector: Injector,
componentType: Type): Promise<ComponentRef> { componentType: Type): Promise<ComponentRef<any>> {
var appRef: ApplicationRef = injector.get(ApplicationRef); var appRef: ApplicationRef = injector.get(ApplicationRef);
return appRef.run(() => { return appRef.run(() => {
var componentResolver: ComponentResolver = injector.get(ComponentResolver); var componentResolver: ComponentResolver = injector.get(ComponentResolver);
@ -190,7 +190,7 @@ export abstract class ApplicationRef {
* Register a listener to be called each time `bootstrap()` is called to bootstrap * Register a listener to be called each time `bootstrap()` is called to bootstrap
* a new root component. * a new root component.
*/ */
abstract registerBootstrapListener(listener: (ref: ComponentRef) => void): void; abstract registerBootstrapListener(listener: (ref: ComponentRef<any>) => void): void;
/** /**
* Register a listener to be called when the application is disposed. * Register a listener to be called when the application is disposed.
@ -221,7 +221,7 @@ export abstract class ApplicationRef {
* ### Example * ### Example
* {@example core/ts/platform/platform.ts region='longform'} * {@example core/ts/platform/platform.ts region='longform'}
*/ */
abstract bootstrap(componentFactory: ComponentFactory): ComponentRef; abstract bootstrap<C>(componentFactory: ComponentFactory<C>): ComponentRef<C>;
/** /**
* Retrieve the application {@link Injector}. * Retrieve the application {@link Injector}.
@ -266,7 +266,7 @@ export class ApplicationRef_ extends ApplicationRef {
/** @internal */ /** @internal */
private _disposeListeners: Function[] = []; private _disposeListeners: Function[] = [];
/** @internal */ /** @internal */
private _rootComponents: ComponentRef[] = []; private _rootComponents: ComponentRef<any>[] = [];
/** @internal */ /** @internal */
private _rootComponentTypes: Type[] = []; private _rootComponentTypes: Type[] = [];
/** @internal */ /** @internal */
@ -315,7 +315,7 @@ export class ApplicationRef_ extends ApplicationRef {
(_) => { this._zone.run(() => { this.tick(); }); }); (_) => { this._zone.run(() => { this.tick(); }); });
} }
registerBootstrapListener(listener: (ref: ComponentRef) => void): void { registerBootstrapListener(listener: (ref: ComponentRef<any>) => void): void {
this._bootstrapListeners.push(listener); this._bootstrapListeners.push(listener);
} }
@ -357,7 +357,7 @@ export class ApplicationRef_ extends ApplicationRef {
return isPromise(result) ? completer.promise : result; return isPromise(result) ? completer.promise : result;
} }
bootstrap(componentFactory: ComponentFactory): ComponentRef { bootstrap<C>(componentFactory: ComponentFactory<C>): ComponentRef<C> {
if (!this._asyncInitDone) { if (!this._asyncInitDone) {
throw new BaseException( throw new BaseException(
'Cannot bootstrap as there are still asynchronous initializers running. Wait for them using waitForAsyncInitializers().'); 'Cannot bootstrap as there are still asynchronous initializers running. Wait for them using waitForAsyncInitializers().');
@ -383,7 +383,7 @@ export class ApplicationRef_ extends ApplicationRef {
} }
/** @internal */ /** @internal */
_loadComponent(componentRef: ComponentRef): void { _loadComponent(componentRef: ComponentRef<any>): void {
this._changeDetectorRefs.push(componentRef.changeDetectorRef); this._changeDetectorRefs.push(componentRef.changeDetectorRef);
this.tick(); this.tick();
this._rootComponents.push(componentRef); this._rootComponents.push(componentRef);
@ -391,7 +391,7 @@ export class ApplicationRef_ extends ApplicationRef {
} }
/** @internal */ /** @internal */
_unloadComponent(componentRef: ComponentRef): void { _unloadComponent(componentRef: ComponentRef<any>): void {
if (!ListWrapper.contains(this._rootComponents, componentRef)) { if (!ListWrapper.contains(this._rootComponents, componentRef)) {
return; return;
} }

View File

@ -14,7 +14,7 @@ import {ChangeDetectorRef} from '../change_detection/change_detection';
* Component Instance and allows you to destroy the Component Instance via the {@link #destroy} * Component Instance and allows you to destroy the Component Instance via the {@link #destroy}
* method. * method.
*/ */
export abstract class ComponentRef { export abstract class ComponentRef<C> {
/** /**
* Location of the Host Element of this Component Instance. * Location of the Host Element of this Component Instance.
*/ */
@ -28,7 +28,7 @@ export abstract class ComponentRef {
/** /**
* The instance of the Component. * The instance of the Component.
*/ */
get instance(): any { return unimplemented(); }; get instance(): C { return unimplemented(); };
/** /**
* The {@link ViewRef} of the Host View of this Component instance. * The {@link ViewRef} of the Host View of this Component instance.
@ -56,11 +56,11 @@ export abstract class ComponentRef {
abstract onDestroy(callback: Function): void; abstract onDestroy(callback: Function): void;
} }
export class ComponentRef_ extends ComponentRef { export class ComponentRef_<C> extends ComponentRef<C> {
constructor(private _hostElement: AppElement, private _componentType: Type) { super(); } constructor(private _hostElement: AppElement, private _componentType: Type) { super(); }
get location(): ElementRef { return this._hostElement.elementRef; } get location(): ElementRef { return this._hostElement.elementRef; }
get injector(): Injector { return this._hostElement.injector; } get injector(): Injector { return this._hostElement.injector; }
get instance(): any { return this._hostElement.component; }; get instance(): C { return this._hostElement.component; };
get hostView(): ViewRef { return this._hostElement.parentView.ref; }; get hostView(): ViewRef { return this._hostElement.parentView.ref; };
get changeDetectorRef(): ChangeDetectorRef { return this._hostElement.parentView.ref; }; get changeDetectorRef(): ChangeDetectorRef { return this._hostElement.parentView.ref; };
get componentType(): Type { return this._componentType; } get componentType(): Type { return this._componentType; }
@ -72,7 +72,7 @@ export class ComponentRef_ extends ComponentRef {
const EMPTY_CONTEXT = /*@ts2dart_const*/ new Object(); const EMPTY_CONTEXT = /*@ts2dart_const*/ new Object();
/*@ts2dart_const*/ /*@ts2dart_const*/
export class ComponentFactory { export class ComponentFactory<C> {
constructor(public selector: string, private _viewFactory: Function, constructor(public selector: string, private _viewFactory: Function,
private _componentType: Type) {} private _componentType: Type) {}
@ -82,7 +82,7 @@ export class ComponentFactory {
* Creates a new component. * Creates a new component.
*/ */
create(injector: Injector, projectableNodes: any[][] = null, create(injector: Injector, projectableNodes: any[][] = null,
rootSelectorOrNode: string | any = null): ComponentRef { rootSelectorOrNode: string | any = null): ComponentRef<C> {
var vu: ViewUtils = injector.get(ViewUtils); var vu: ViewUtils = injector.get(ViewUtils);
if (isBlank(projectableNodes)) { if (isBlank(projectableNodes)) {
projectableNodes = []; projectableNodes = [];
@ -90,6 +90,6 @@ export class ComponentFactory {
// Note: Host views don't need a declarationAppElement! // Note: Host views don't need a declarationAppElement!
var hostView = this._viewFactory(vu, injector, null); var hostView = this._viewFactory(vu, injector, null);
var hostElement = hostView.create(EMPTY_CONTEXT, projectableNodes, rootSelectorOrNode); var hostElement = hostView.create(EMPTY_CONTEXT, projectableNodes, rootSelectorOrNode);
return new ComponentRef_(hostElement, this._componentType); return new ComponentRef_<C>(hostElement, this._componentType);
} }
} }

View File

@ -10,7 +10,7 @@ import {ComponentFactory} from './component_factory';
* can later be used to create and render a Component instance. * can later be used to create and render a Component instance.
*/ */
export abstract class ComponentResolver { export abstract class ComponentResolver {
abstract resolveComponent(componentType: Type): Promise<ComponentFactory>; abstract resolveComponent(componentType: Type): Promise<ComponentFactory<any>>;
abstract clearCache(); abstract clearCache();
} }
@ -20,7 +20,7 @@ function _isComponentFactory(type: any): boolean {
@Injectable() @Injectable()
export class ReflectorComponentResolver extends ComponentResolver { export class ReflectorComponentResolver extends ComponentResolver {
resolveComponent(componentType: Type): Promise<ComponentFactory> { resolveComponent(componentType: Type): Promise<ComponentFactory<any>> {
var metadatas = reflector.annotations(componentType); var metadatas = reflector.annotations(componentType);
var componentFactory = metadatas.find(_isComponentFactory); var componentFactory = metadatas.find(_isComponentFactory);

View File

@ -65,7 +65,8 @@ export abstract class DynamicComponentLoader {
* ``` * ```
*/ */
abstract loadAsRoot(type: Type, overrideSelectorOrNode: string | any, injector: Injector, abstract loadAsRoot(type: Type, overrideSelectorOrNode: string | any, injector: Injector,
onDispose?: () => void, projectableNodes?: any[][]): Promise<ComponentRef>; onDispose?: () => void,
projectableNodes?: any[][]): Promise<ComponentRef<any>>;
/** /**
@ -110,7 +111,7 @@ export abstract class DynamicComponentLoader {
*/ */
abstract loadNextToLocation(type: Type, location: ViewContainerRef, abstract loadNextToLocation(type: Type, location: ViewContainerRef,
providers?: ResolvedReflectiveProvider[], providers?: ResolvedReflectiveProvider[],
projectableNodes?: any[][]): Promise<ComponentRef>; projectableNodes?: any[][]): Promise<ComponentRef<any>>;
} }
@Injectable() @Injectable()
@ -118,7 +119,7 @@ export class DynamicComponentLoader_ extends DynamicComponentLoader {
constructor(private _compiler: ComponentResolver) { super(); } constructor(private _compiler: ComponentResolver) { super(); }
loadAsRoot(type: Type, overrideSelectorOrNode: string | any, injector: Injector, loadAsRoot(type: Type, overrideSelectorOrNode: string | any, injector: Injector,
onDispose?: () => void, projectableNodes?: any[][]): Promise<ComponentRef> { onDispose?: () => void, projectableNodes?: any[][]): Promise<ComponentRef<any>> {
return this._compiler.resolveComponent(type).then(componentFactory => { return this._compiler.resolveComponent(type).then(componentFactory => {
var componentRef = componentFactory.create( var componentRef = componentFactory.create(
injector, projectableNodes, injector, projectableNodes,
@ -132,7 +133,7 @@ export class DynamicComponentLoader_ extends DynamicComponentLoader {
loadNextToLocation(type: Type, location: ViewContainerRef, loadNextToLocation(type: Type, location: ViewContainerRef,
providers: ResolvedReflectiveProvider[] = null, providers: ResolvedReflectiveProvider[] = null,
projectableNodes: any[][] = null): Promise<ComponentRef> { projectableNodes: any[][] = null): Promise<ComponentRef<any>> {
return this._compiler.resolveComponent(type).then(componentFactory => { return this._compiler.resolveComponent(type).then(componentFactory => {
var contextInjector = location.parentInjector; var contextInjector = location.parentInjector;
var childInjector = isPresent(providers) && providers.length > 0 ? var childInjector = isPresent(providers) && providers.length > 0 ?

View File

@ -62,9 +62,8 @@ export abstract class ViewContainerRef {
* *
* Returns the {@link ViewRef} for the newly created View. * Returns the {@link ViewRef} for the newly created View.
*/ */
// TODO(tbosch): Use a generic once ts2dart supports it. abstract createEmbeddedView<C>(templateRef: TemplateRef<C>, context?: C,
abstract createEmbeddedView(templateRef: TemplateRef<any>, context?: any, index?: number): EmbeddedViewRef<C>;
index?: number): EmbeddedViewRef<any>;
/** /**
* Instantiates a single {@link Component} and inserts its Host View into this container at the * Instantiates a single {@link Component} and inserts its Host View into this container at the
@ -79,8 +78,8 @@ export abstract class ViewContainerRef {
* *
* Returns the {@link ComponentRef} of the Host View created for the newly instantiated Component. * Returns the {@link ComponentRef} of the Host View created for the newly instantiated Component.
*/ */
abstract createComponent(componentFactory: ComponentFactory, index?: number, injector?: Injector, abstract createComponent<C>(componentFactory: ComponentFactory<C>, index?: number,
projectableNodes?: any[][]): ComponentRef; injector?: Injector, projectableNodes?: any[][]): ComponentRef<C>;
/** /**
* Inserts a View identified by a {@link ViewRef} into the container at the specified `index`. * Inserts a View identified by a {@link ViewRef} into the container at the specified `index`.
@ -129,9 +128,8 @@ export class ViewContainerRef_ implements ViewContainerRef {
// TODO(rado): profile and decide whether bounds checks should be added // TODO(rado): profile and decide whether bounds checks should be added
// to the methods below. // to the methods below.
// TODO(tbosch): use a generic C once ts2dart supports it. createEmbeddedView<C>(templateRef: TemplateRef<C>, context: C = null,
createEmbeddedView(templateRef: TemplateRef<any>, context: any = null, index: number = -1): EmbeddedViewRef<C> {
index: number = -1): EmbeddedViewRef<any> {
var viewRef: EmbeddedViewRef<any> = templateRef.createEmbeddedView(context); var viewRef: EmbeddedViewRef<any> = templateRef.createEmbeddedView(context);
this.insert(viewRef, index); this.insert(viewRef, index);
return viewRef; return viewRef;
@ -141,8 +139,8 @@ export class ViewContainerRef_ implements ViewContainerRef {
_createComponentInContainerScope: WtfScopeFn = _createComponentInContainerScope: WtfScopeFn =
wtfCreateScope('ViewContainerRef#createComponent()'); wtfCreateScope('ViewContainerRef#createComponent()');
createComponent(componentFactory: ComponentFactory, index: number = -1, injector: Injector = null, createComponent<C>(componentFactory: ComponentFactory<C>, index: number = -1,
projectableNodes: any[][] = null): ComponentRef { injector: Injector = null, projectableNodes: any[][] = null): ComponentRef<C> {
var s = this._createComponentInContainerScope(); var s = this._createComponentInContainerScope();
var contextInjector = isPresent(injector) ? injector : this._element.parentInjector; var contextInjector = isPresent(injector) ? injector : this._element.parentInjector;
var componentRef = componentFactory.create(contextInjector, projectableNodes); var componentRef = componentFactory.create(contextInjector, projectableNodes);

View File

@ -9,11 +9,11 @@ import {NgZone} from 'angular2/src/core/zone/ng_zone';
*/ */
@Injectable() @Injectable()
export class MockApplicationRef extends ApplicationRef { export class MockApplicationRef extends ApplicationRef {
registerBootstrapListener(listener: (ref: ComponentRef) => void): void {} registerBootstrapListener(listener: (ref: ComponentRef<any>) => void): void {}
registerDisposeListener(dispose: () => void): void {} registerDisposeListener(dispose: () => void): void {}
bootstrap(componentFactory: ComponentFactory): ComponentRef { return null; } bootstrap<C>(componentFactory: ComponentFactory<C>): ComponentRef<C> { return null; }
get injector(): Injector { return null; }; get injector(): Injector { return null; };

View File

@ -15,7 +15,7 @@ export class ChangeDetectionPerfRecord {
export class AngularTools { export class AngularTools {
profiler: AngularProfiler; profiler: AngularProfiler;
constructor(ref: ComponentRef) { this.profiler = new AngularProfiler(ref); } constructor(ref: ComponentRef<any>) { this.profiler = new AngularProfiler(ref); }
} }
/** /**
@ -25,7 +25,7 @@ export class AngularTools {
export class AngularProfiler { export class AngularProfiler {
appRef: ApplicationRef; appRef: ApplicationRef;
constructor(ref: ComponentRef) { this.appRef = ref.injector.get(ApplicationRef); } constructor(ref: ComponentRef<any>) { this.appRef = ref.injector.get(ApplicationRef); }
/** /**
* Exercises change detection in a loop and then prints the average amount of * Exercises change detection in a loop and then prints the average amount of

View File

@ -16,7 +16,7 @@ import 'common_tools.dart' show AngularTools;
* 1. Try the change detection profiler `ng.profiler.timeChangeDetection()` * 1. Try the change detection profiler `ng.profiler.timeChangeDetection()`
* then hit Enter. * then hit Enter.
*/ */
void enableDebugTools(ComponentRef ref) { void enableDebugTools(ComponentRef<dynamic> ref) {
final tools = new AngularTools(ref); final tools = new AngularTools(ref);
context['ng'] = new JsObject.jsify({ context['ng'] = new JsObject.jsify({
'profiler': { 'profiler': {

View File

@ -15,7 +15,7 @@ var context = <any>global;
* 1. Try the change detection profiler `ng.profiler.timeChangeDetection()` * 1. Try the change detection profiler `ng.profiler.timeChangeDetection()`
* then hit Enter. * then hit Enter.
*/ */
export function enableDebugTools(ref: ComponentRef): void { export function enableDebugTools(ref: ComponentRef<any>): void {
context.ng = new AngularTools(ref); context.ng = new AngularTools(ref);
} }

View File

@ -34,7 +34,7 @@ let _resolveToTrue = PromiseWrapper.resolve(true);
@Directive({selector: 'router-outlet'}) @Directive({selector: 'router-outlet'})
export class RouterOutlet implements OnDestroy { export class RouterOutlet implements OnDestroy {
name: string = null; name: string = null;
private _componentRef: Promise<ComponentRef> = null; private _componentRef: Promise<ComponentRef<any>> = null;
private _currentInstruction: ComponentInstruction = null; private _currentInstruction: ComponentInstruction = null;
@Output('activate') public activateEvents = new EventEmitter<any>(); @Output('activate') public activateEvents = new EventEmitter<any>();
@ -70,7 +70,7 @@ export class RouterOutlet implements OnDestroy {
this.activateEvents.emit(componentRef.instance); this.activateEvents.emit(componentRef.instance);
if (hasLifecycleHook(hookMod.routerOnActivate, componentType)) { if (hasLifecycleHook(hookMod.routerOnActivate, componentType)) {
return this._componentRef.then( return this._componentRef.then(
(ref: ComponentRef) => (ref: ComponentRef<any>) =>
(<OnActivate>ref.instance).routerOnActivate(nextInstruction, previousInstruction)); (<OnActivate>ref.instance).routerOnActivate(nextInstruction, previousInstruction));
} else { } else {
return componentRef; return componentRef;
@ -96,7 +96,7 @@ export class RouterOutlet implements OnDestroy {
return PromiseWrapper.resolve( return PromiseWrapper.resolve(
hasLifecycleHook(hookMod.routerOnReuse, this._currentInstruction.componentType) ? hasLifecycleHook(hookMod.routerOnReuse, this._currentInstruction.componentType) ?
this._componentRef.then( this._componentRef.then(
(ref: ComponentRef) => (ref: ComponentRef<any>) =>
(<OnReuse>ref.instance).routerOnReuse(nextInstruction, previousInstruction)) : (<OnReuse>ref.instance).routerOnReuse(nextInstruction, previousInstruction)) :
true); true);
} }
@ -111,13 +111,13 @@ export class RouterOutlet implements OnDestroy {
if (isPresent(this._componentRef) && isPresent(this._currentInstruction) && if (isPresent(this._componentRef) && isPresent(this._currentInstruction) &&
hasLifecycleHook(hookMod.routerOnDeactivate, this._currentInstruction.componentType)) { hasLifecycleHook(hookMod.routerOnDeactivate, this._currentInstruction.componentType)) {
next = this._componentRef.then( next = this._componentRef.then(
(ref: ComponentRef) => (ref: ComponentRef<any>) =>
(<OnDeactivate>ref.instance) (<OnDeactivate>ref.instance)
.routerOnDeactivate(nextInstruction, this._currentInstruction)); .routerOnDeactivate(nextInstruction, this._currentInstruction));
} }
return next.then((_) => { return next.then((_) => {
if (isPresent(this._componentRef)) { if (isPresent(this._componentRef)) {
var onDispose = this._componentRef.then((ref: ComponentRef) => ref.destroy()); var onDispose = this._componentRef.then((ref: ComponentRef<any>) => ref.destroy());
this._componentRef = null; this._componentRef = null;
return onDispose; return onDispose;
} }
@ -138,7 +138,7 @@ export class RouterOutlet implements OnDestroy {
} }
if (hasLifecycleHook(hookMod.routerCanDeactivate, this._currentInstruction.componentType)) { if (hasLifecycleHook(hookMod.routerCanDeactivate, this._currentInstruction.componentType)) {
return this._componentRef.then( return this._componentRef.then(
(ref: ComponentRef) => (ref: ComponentRef<any>) =>
(<CanDeactivate>ref.instance) (<CanDeactivate>ref.instance)
.routerCanDeactivate(nextInstruction, this._currentInstruction)); .routerCanDeactivate(nextInstruction, this._currentInstruction));
} else { } else {
@ -164,7 +164,7 @@ export class RouterOutlet implements OnDestroy {
result = false; result = false;
} else if (hasLifecycleHook(hookMod.routerCanReuse, this._currentInstruction.componentType)) { } else if (hasLifecycleHook(hookMod.routerCanReuse, this._currentInstruction.componentType)) {
result = this._componentRef.then( result = this._componentRef.then(
(ref: ComponentRef) => (ref: ComponentRef<any>) =>
(<CanReuse>ref.instance).routerCanReuse(nextInstruction, this._currentInstruction)); (<CanReuse>ref.instance).routerCanReuse(nextInstruction, this._currentInstruction));
} else { } else {
result = nextInstruction == this._currentInstruction || result = nextInstruction == this._currentInstruction ||

View File

@ -1,7 +1,8 @@
import { import {
OpaqueToken, OpaqueToken,
ComponentRef, ComponentRef,
DynamicComponentLoader, ComponentFactory,
ComponentResolver,
Injector, Injector,
Injectable, Injectable,
ViewMetadata, ViewMetadata,
@ -34,7 +35,7 @@ export var ComponentFixtureNoNgZone = new OpaqueToken("ComponentFixtureNoNgZone"
/** /**
* Fixture for debugging and testing a component. * Fixture for debugging and testing a component.
*/ */
export class ComponentFixture { export class ComponentFixture<T> {
/** /**
* The DebugElement associated with the root element of this component. * The DebugElement associated with the root element of this component.
*/ */
@ -58,7 +59,7 @@ export class ComponentFixture {
/** /**
* The ComponentRef for the component * The ComponentRef for the component
*/ */
componentRef: ComponentRef; componentRef: ComponentRef<T>;
/** /**
* The ChangeDetectorRef for the component * The ChangeDetectorRef for the component
@ -79,7 +80,7 @@ export class ComponentFixture {
private _onMicrotaskEmptySubscription = null; private _onMicrotaskEmptySubscription = null;
private _onErrorSubscription = null; private _onErrorSubscription = null;
constructor(componentRef: ComponentRef, ngZone: NgZone, autoDetect: boolean) { constructor(componentRef: ComponentRef<T>, ngZone: NgZone, autoDetect: boolean) {
this.changeDetectorRef = componentRef.changeDetectorRef; this.changeDetectorRef = componentRef.changeDetectorRef;
this.elementRef = componentRef.location; this.elementRef = componentRef.location;
this.debugElement = <DebugElement>getDebugNode(this.elementRef.nativeElement); this.debugElement = <DebugElement>getDebugNode(this.elementRef.nativeElement);
@ -334,15 +335,30 @@ export class TestComponentBuilder {
return this.overrideViewProviders(type, providers); return this.overrideViewProviders(type, providers);
} }
private _create<C>(ngZone: NgZone, componentFactory: ComponentFactory<C>): ComponentFixture<C> {
let rootElId = `root${_nextRootElementId++}`;
let rootEl = el(`<div id="${rootElId}"></div>`);
let doc = this._injector.get(DOCUMENT);
// TODO(juliemr): can/should this be optional?
let oldRoots = DOM.querySelectorAll(doc, '[id^=root]');
for (let i = 0; i < oldRoots.length; i++) {
DOM.remove(oldRoots[i]);
}
DOM.appendChild(doc.body, rootEl);
var componentRef = componentFactory.create(this._injector, [], `#${rootElId}`);
let autoDetect: boolean = this._injector.get(ComponentFixtureAutoDetect, false);
return new ComponentFixture<any /*C*/>(componentRef, ngZone, autoDetect);
}
/** /**
* Builds and returns a ComponentFixture. * Builds and returns a ComponentFixture.
* *
* @return {Promise<ComponentFixture>} * @return {Promise<ComponentFixture>}
*/ */
createAsync(rootComponentType: Type): Promise<ComponentFixture> { createAsync(rootComponentType: Type): Promise<ComponentFixture<any>> {
let noNgZone = IS_DART || this._injector.get(ComponentFixtureNoNgZone, false); let noNgZone = IS_DART || this._injector.get(ComponentFixtureNoNgZone, false);
let ngZone: NgZone = noNgZone ? null : this._injector.get(NgZone, null); let ngZone: NgZone = noNgZone ? null : this._injector.get(NgZone, null);
let autoDetect: boolean = this._injector.get(ComponentFixtureAutoDetect, false);
let initComponent = () => { let initComponent = () => {
let mockDirectiveResolver = this._injector.get(DirectiveResolver); let mockDirectiveResolver = this._injector.get(DirectiveResolver);
@ -359,28 +375,15 @@ export class TestComponentBuilder {
this._viewBindingsOverrides.forEach( this._viewBindingsOverrides.forEach(
(bindings, type) => mockDirectiveResolver.setViewBindingsOverride(type, bindings)); (bindings, type) => mockDirectiveResolver.setViewBindingsOverride(type, bindings));
let rootElId = `root${_nextRootElementId++}`; let promise: Promise<ComponentFactory<any>> =
let rootEl = el(`<div id="${rootElId}"></div>`); this._injector.get(ComponentResolver).resolveComponent(rootComponentType);
let doc = this._injector.get(DOCUMENT); return promise.then(componentFactory => this._create(ngZone, componentFactory));
// TODO(juliemr): can/should this be optional?
let oldRoots = DOM.querySelectorAll(doc, '[id^=root]');
for (let i = 0; i < oldRoots.length; i++) {
DOM.remove(oldRoots[i]);
}
DOM.appendChild(doc.body, rootEl);
let promise: Promise<ComponentRef> =
this._injector.get(DynamicComponentLoader)
.loadAsRoot(rootComponentType, `#${rootElId}`, this._injector);
return promise.then(
(componentRef) => { return new ComponentFixture(componentRef, ngZone, autoDetect); });
}; };
return ngZone == null ? initComponent() : ngZone.run(initComponent); return ngZone == null ? initComponent() : ngZone.run(initComponent);
} }
createFakeAsync(rootComponentType: Type): ComponentFixture { createFakeAsync(rootComponentType: Type): ComponentFixture<any> {
let result; let result;
let error; let error;
PromiseWrapper.then(this.createAsync(rootComponentType), (_result) => { result = _result; }, PromiseWrapper.then(this.createAsync(rootComponentType), (_result) => { result = _result; },
@ -391,4 +394,12 @@ export class TestComponentBuilder {
} }
return result; return result;
} }
createSync<C>(componentFactory: ComponentFactory<C>): ComponentFixture<C> {
let noNgZone = IS_DART || this._injector.get(ComponentFixtureNoNgZone, false);
let ngZone: NgZone = noNgZone ? null : this._injector.get(NgZone, null);
let initComponent = () => this._create(ngZone, componentFactory);
return ngZone == null ? initComponent() : ngZone.run(initComponent);
}
} }

View File

@ -21,7 +21,7 @@ export class DowngradeNg2ComponentAdapter {
component: any = null; component: any = null;
inputChangeCount: number = 0; inputChangeCount: number = 0;
inputChanges: {[key: string]: SimpleChange} = null; inputChanges: {[key: string]: SimpleChange} = null;
componentRef: ComponentRef = null; componentRef: ComponentRef<any> = null;
changeDetector: ChangeDetectorRef = null; changeDetector: ChangeDetectorRef = null;
componentScope: angular.IScope; componentScope: angular.IScope;
childNodes: Node[]; childNodes: Node[];
@ -30,7 +30,8 @@ export class DowngradeNg2ComponentAdapter {
constructor(private id: string, private info: ComponentInfo, constructor(private id: string, private info: ComponentInfo,
private element: angular.IAugmentedJQuery, private attrs: angular.IAttributes, private element: angular.IAugmentedJQuery, private attrs: angular.IAttributes,
private scope: angular.IScope, private parentInjector: Injector, private scope: angular.IScope, private parentInjector: Injector,
private parse: angular.IParseService, private componentFactory: ComponentFactory) { private parse: angular.IParseService,
private componentFactory: ComponentFactory<any>) {
(<any>this.element[0]).id = id; (<any>this.element[0]).id = id;
this.componentScope = scope.$new(); this.componentScope = scope.$new();
this.childNodes = <Node[]><any>element.contents(); this.childNodes = <Node[]><any>element.contents();

View File

@ -524,12 +524,12 @@ export class UpgradeAdapter {
private compileNg2Components(compiler: ComponentResolver, private compileNg2Components(compiler: ComponentResolver,
componentFactoryRefMap: ComponentFactoryRefMap): componentFactoryRefMap: ComponentFactoryRefMap):
Promise<ComponentFactoryRefMap> { Promise<ComponentFactoryRefMap> {
var promises: Array<Promise<ComponentFactory>> = []; var promises: Array<Promise<ComponentFactory<any>>> = [];
var types = this.upgradedComponents; var types = this.upgradedComponents;
for (var i = 0; i < types.length; i++) { for (var i = 0; i < types.length; i++) {
promises.push(compiler.resolveComponent(types[i])); promises.push(compiler.resolveComponent(types[i]));
} }
return Promise.all(promises).then((componentFactories: Array<ComponentFactory>) => { return Promise.all(promises).then((componentFactories: Array<ComponentFactory<any>>) => {
var types = this.upgradedComponents; var types = this.upgradedComponents;
for (var i = 0; i < componentFactories.length; i++) { for (var i = 0; i < componentFactories.length; i++) {
componentFactoryRefMap[getComponentInfo(types[i]).selector] = componentFactories[i]; componentFactoryRefMap[getComponentInfo(types[i]).selector] = componentFactories[i];
@ -540,14 +540,14 @@ export class UpgradeAdapter {
} }
interface ComponentFactoryRefMap { interface ComponentFactoryRefMap {
[selector: string]: ComponentFactory; [selector: string]: ComponentFactory<any>;
} }
function ng1ComponentDirective(info: ComponentInfo, idPrefix: string): Function { function ng1ComponentDirective(info: ComponentInfo, idPrefix: string): Function {
(<any>directiveFactory).$inject = [NG2_COMPONENT_FACTORY_REF_MAP, NG1_PARSE]; (<any>directiveFactory).$inject = [NG2_COMPONENT_FACTORY_REF_MAP, NG1_PARSE];
function directiveFactory(componentFactoryRefMap: ComponentFactoryRefMap, function directiveFactory(componentFactoryRefMap: ComponentFactoryRefMap,
parse: angular.IParseService): angular.IDirective { parse: angular.IParseService): angular.IDirective {
var componentFactory: ComponentFactory = componentFactoryRefMap[info.selector]; var componentFactory: ComponentFactory<any> = componentFactoryRefMap[info.selector];
if (!componentFactory) throw new Error('Expecting ComponentFactory for: ' + info.selector); if (!componentFactory) throw new Error('Expecting ComponentFactory for: ' + info.selector);
var idCount = 0; var idCount = 0;
return { return {

View File

@ -213,12 +213,12 @@ export function main() {
}); });
} }
function advance(fixture: ComponentFixture): void { function advance(fixture: ComponentFixture<any>): void {
tick(); tick();
fixture.detectChanges(); fixture.detectChanges();
} }
function compileRoot(tcb: TestComponentBuilder): Promise<ComponentFixture> { function compileRoot(tcb: TestComponentBuilder): Promise<ComponentFixture<any>> {
return tcb.createAsync(RootCmp); return tcb.createAsync(RootCmp);
} }

View File

@ -19,7 +19,7 @@ import {Component, provide} from 'angular2/core';
import {NgFor} from 'angular2/common'; import {NgFor} from 'angular2/common';
import {NgClass} from 'angular2/src/common/directives/ng_class'; import {NgClass} from 'angular2/src/common/directives/ng_class';
function detectChangesAndCheck(fixture: ComponentFixture, classes: string) { function detectChangesAndCheck(fixture: ComponentFixture<any>, classes: string) {
fixture.detectChanges(); fixture.detectChanges();
expect(fixture.debugElement.children[0].nativeElement.className).toEqual(classes); expect(fixture.debugElement.children[0].nativeElement.className).toEqual(classes);
} }

View File

@ -132,9 +132,7 @@ export function main() {
<span>{{name}}</span> <span>{{name}}</span>
</div>`; </div>`;
var fixture: ComponentFixture; let fixture = tcb.overrideTemplate(MyComp, t).createFakeAsync(MyComp);
tcb.overrideTemplate(MyComp, t).createAsync(MyComp).then((root) => { fixture = root; });
tick(); tick();
fixture.debugElement.componentInstance.form = new ControlGroup({}); fixture.debugElement.componentInstance.form = new ControlGroup({});
@ -928,8 +926,7 @@ export function main() {
var t = var t =
`<div [ngFormModel]="form"><input type="text" ngControl="name" [(ngModel)]="name"></div>`; `<div [ngFormModel]="form"><input type="text" ngControl="name" [(ngModel)]="name"></div>`;
var fixture: ComponentFixture; let fixture = tcb.overrideTemplate(MyComp, t).createFakeAsync(MyComp);
tcb.overrideTemplate(MyComp, t).createAsync(MyComp).then((root) => { fixture = root; });
tick(); tick();
fixture.debugElement.componentInstance.name = 'oldValue'; fixture.debugElement.componentInstance.name = 'oldValue';
@ -952,8 +949,7 @@ export function main() {
var t = `<div><input type="text" [ngFormControl]="form" [(ngModel)]="name"></div>`; var t = `<div><input type="text" [ngFormControl]="form" [(ngModel)]="name"></div>`;
var fixture: ComponentFixture; let fixture = tcb.overrideTemplate(MyComp, t).createFakeAsync(MyComp);
tcb.overrideTemplate(MyComp, t).createAsync(MyComp).then((root) => { fixture = root; });
tick(); tick();
fixture.debugElement.componentInstance.form = form; fixture.debugElement.componentInstance.form = form;
fixture.debugElement.componentInstance.name = "oldValue"; fixture.debugElement.componentInstance.name = "oldValue";
@ -978,8 +974,7 @@ export function main() {
</div> </div>
</form>`; </form>`;
var fixture: ComponentFixture; let fixture = tcb.overrideTemplate(MyComp, t).createFakeAsync(MyComp);
tcb.overrideTemplate(MyComp, t).createAsync(MyComp).then((root) => { fixture = root; });
tick(); tick();
fixture.debugElement.componentInstance.name = null; fixture.debugElement.componentInstance.name = null;
fixture.detectChanges(); fixture.detectChanges();
@ -997,8 +992,7 @@ export function main() {
fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => {
var t = `<div><form (ngSubmit)="name='updated'"></form></div>`; var t = `<div><form (ngSubmit)="name='updated'"></form></div>`;
var fixture: ComponentFixture; let fixture = tcb.overrideTemplate(MyComp, t).createFakeAsync(MyComp);
tcb.overrideTemplate(MyComp, t).createAsync(MyComp).then((root) => { fixture = root; });
tick(); tick();
fixture.debugElement.componentInstance.name = 'old'; fixture.debugElement.componentInstance.name = 'old';
var form = fixture.debugElement.query(By.css("form")); var form = fixture.debugElement.query(By.css("form"));
@ -1031,8 +1025,7 @@ export function main() {
</div> </div>
</form>`; </form>`;
var fixture: ComponentFixture; let fixture = tcb.overrideTemplate(MyComp, t).createFakeAsync(MyComp);
tcb.overrideTemplate(MyComp, t).createAsync(MyComp).then((root) => { fixture = root; });
tick(); tick();
fixture.debugElement.componentInstance.name = 'show'; fixture.debugElement.componentInstance.name = 'show';
fixture.detectChanges(); fixture.detectChanges();
@ -1058,8 +1051,7 @@ export function main() {
</form>`; </form>`;
var fixture: ComponentFixture; let fixture = tcb.overrideTemplate(MyComp, t).createFakeAsync(MyComp);
tcb.overrideTemplate(MyComp, t).createAsync(MyComp).then((root) => { fixture = root; });
tick(); tick();
fixture.debugElement.componentInstance.name = 'show'; fixture.debugElement.componentInstance.name = 'show';
fixture.detectChanges(); fixture.detectChanges();
@ -1081,8 +1073,7 @@ export function main() {
<input type="text" ngControl="name" [(ngModel)]="name"> <input type="text" ngControl="name" [(ngModel)]="name">
</form>`; </form>`;
var fixture: ComponentFixture; let fixture = tcb.overrideTemplate(MyComp, t).createFakeAsync(MyComp);
tcb.overrideTemplate(MyComp, t).createAsync(MyComp).then((root) => { fixture = root; });
tick(); tick();
fixture.debugElement.componentInstance.name = "oldValue"; fixture.debugElement.componentInstance.name = "oldValue";
fixture.detectChanges(); fixture.detectChanges();
@ -1103,8 +1094,7 @@ export function main() {
fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => {
var t = `<div><input type="text" [(ngModel)]="name"></div>`; var t = `<div><input type="text" [(ngModel)]="name"></div>`;
var fixture: ComponentFixture; let fixture = tcb.overrideTemplate(MyComp, t).createFakeAsync(MyComp);
tcb.overrideTemplate(MyComp, t).createAsync(MyComp).then((root) => { fixture = root; });
tick(); tick();
fixture.debugElement.componentInstance.name = "oldValue"; fixture.debugElement.componentInstance.name = "oldValue";
fixture.detectChanges(); fixture.detectChanges();
@ -1131,8 +1121,7 @@ export function main() {
<input type="radio" name="food" ngControl="fish" [(ngModel)]="data['fish2']"> <input type="radio" name="food" ngControl="fish" [(ngModel)]="data['fish2']">
</form>`; </form>`;
var fixture: ComponentFixture; let fixture = tcb.overrideTemplate(MyComp, t).createFakeAsync(MyComp);
tcb.overrideTemplate(MyComp, t).createAsync(MyComp).then((f) => { fixture = f; });
tick(); tick();
fixture.debugElement.componentInstance.data = { fixture.debugElement.componentInstance.data = {
@ -1248,8 +1237,7 @@ export function main() {
var form = new Control(""); var form = new Control("");
var t = `<div><input type="text" [ngFormControl]="form" [(ngModel)]="name"></div>`; var t = `<div><input type="text" [ngFormControl]="form" [(ngModel)]="name"></div>`;
var fixture: ComponentFixture; let fixture = tcb.overrideTemplate(MyComp, t).createFakeAsync(MyComp);
tcb.overrideTemplate(MyComp, t).createAsync(MyComp).then((root) => { fixture = root; });
tick(); tick();
fixture.debugElement.componentInstance.form = form; fixture.debugElement.componentInstance.form = form;
fixture.detectChanges(); fixture.detectChanges();
@ -1276,8 +1264,7 @@ export function main() {
it("should update the view when the model is set back to what used to be in the view", it("should update the view when the model is set back to what used to be in the view",
fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => {
var t = `<input type="text" [(ngModel)]="name">`; var t = `<input type="text" [(ngModel)]="name">`;
var fixture: ComponentFixture; let fixture = tcb.overrideTemplate(MyComp, t).createFakeAsync(MyComp);
tcb.overrideTemplate(MyComp, t).createAsync(MyComp).then((root) => { fixture = root; });
tick(); tick();
fixture.debugElement.componentInstance.name = ""; fixture.debugElement.componentInstance.name = "";
fixture.detectChanges(); fixture.detectChanges();
@ -1311,8 +1298,7 @@ export function main() {
// fixed. // fixed.
var t = `<form><div ngControlGroup="x" #x="ngForm"> var t = `<form><div ngControlGroup="x" #x="ngForm">
<input type="text" ngControl="test"></div>{{x.valid}}</form>`; <input type="text" ngControl="test"></div>{{x.valid}}</form>`;
var fixture: ComponentFixture; let fixture = tcb.overrideTemplate(MyComp, t).createFakeAsync(MyComp);
tcb.overrideTemplate(MyComp, t).createAsync(MyComp).then((root) => { fixture = root; });
tick(); tick();
fixture.detectChanges(); fixture.detectChanges();
}))); })));

View File

@ -4,8 +4,9 @@ import {TypeScriptEmitter} from 'angular2/src/compiler/output/ts_emitter';
import {DartEmitter} from 'angular2/src/compiler/output/dart_emitter'; import {DartEmitter} from 'angular2/src/compiler/output/dart_emitter';
import {compileComp, compAMetadata} from './offline_compiler_util'; import {compileComp, compAMetadata} from './offline_compiler_util';
import {ComponentFactory} from 'angular2/src/core/linker/component_factory'; import {ComponentFactory} from 'angular2/src/core/linker/component_factory';
import {CompA} from './offline_compiler_util';
export const CompANgFactory: ComponentFactory = null; export const CompANgFactory: ComponentFactory<CompA> = null;
// Generator // Generator
export function main(args: string[]) { export function main(args: string[]) {

View File

@ -3,8 +3,9 @@ import {print} from 'angular2/src/facade/lang';
import {JavaScriptEmitter} from 'angular2/src/compiler/output/js_emitter'; import {JavaScriptEmitter} from 'angular2/src/compiler/output/js_emitter';
import {compileComp, compAMetadata} from './offline_compiler_util'; import {compileComp, compAMetadata} from './offline_compiler_util';
import {ComponentFactory} from 'angular2/src/core/linker/component_factory'; import {ComponentFactory} from 'angular2/src/core/linker/component_factory';
import {CompA} from './offline_compiler_util';
export const CompANgFactory: ComponentFactory = null; export const CompANgFactory: ComponentFactory<CompA> = null;
// Generator // Generator
export function main(args: string[]) { export function main(args: string[]) {

View File

@ -16,7 +16,6 @@ import {
import {IS_DART} from 'angular2/src/facade/lang'; import {IS_DART} from 'angular2/src/facade/lang';
import {Injector} from 'angular2/core'; import {Injector} from 'angular2/core';
import {DebugNode, DebugElement, getDebugNode} from 'angular2/src/core/debug/debug_node';
import {ComponentFactory} from 'angular2/src/core/linker/component_factory'; import {ComponentFactory} from 'angular2/src/core/linker/component_factory';
import * as typed from './offline_compiler_codegen_typed'; import * as typed from './offline_compiler_codegen_typed';
@ -28,18 +27,18 @@ import {SharedStylesHost} from "angular2/src/platform/dom/shared_styles_host";
import {CompA} from './offline_compiler_util'; import {CompA} from './offline_compiler_util';
export function main() { export function main() {
var outputDefs = [];
var typedComponentFactory = typed.CompANgFactory; var typedComponentFactory = typed.CompANgFactory;
var untypedComponentFactory = untyped.CompANgFactory; var untypedComponentFactory = untyped.CompANgFactory;
var fixtures: TestFixture[] = [];
if (IS_DART || !DOM.supportsDOMEvents()) { if (IS_DART || !DOM.supportsDOMEvents()) {
// Our generator only works on node.js and Dart... // Our generator only works on node.js and Dart...
outputDefs.push({'compAHostComponentFactory': typedComponentFactory, 'name': 'typed'}); fixtures.push(new TestFixture(typedComponentFactory, 'typed'));
} }
if (!IS_DART) { if (!IS_DART) {
// Our generator only works on node.js and Dart... // Our generator only works on node.js and Dart...
if (!DOM.supportsDOMEvents()) { if (!DOM.supportsDOMEvents()) {
outputDefs.push({'compAHostComponentFactory': untypedComponentFactory, 'name': 'untyped'}); fixtures.push(new TestFixture(untypedComponentFactory, 'untyped'));
} }
} }
describe('OfflineCompiler', () => { describe('OfflineCompiler', () => {
@ -51,16 +50,11 @@ export function main() {
sharedStylesHost = _sharedStylesHost; sharedStylesHost = _sharedStylesHost;
})); }));
function createHostComp(cf: ComponentFactory): DebugElement { fixtures.forEach((fixture) => {
var compRef = cf.create(injector); describe(`${fixture.name}`, () => {
return <DebugElement>getDebugNode(compRef.location.nativeElement);
}
outputDefs.forEach((outputDef) => {
describe(`${outputDef['name']}`, () => {
it('should compile components', () => { it('should compile components', () => {
var hostEl = createHostComp(outputDef['compAHostComponentFactory']); var hostEl = fixture.compFactory.create(injector);
expect(hostEl.componentInstance).toBeAnInstanceOf(CompA); expect(hostEl.instance).toBeAnInstanceOf(CompA);
var styles = sharedStylesHost.getAllStyles(); var styles = sharedStylesHost.getAllStyles();
expect(styles[0]).toContain('.redStyle[_ngcontent'); expect(styles[0]).toContain('.redStyle[_ngcontent');
expect(styles[1]).toContain('.greenStyle[_ngcontent'); expect(styles[1]).toContain('.greenStyle[_ngcontent');
@ -69,3 +63,7 @@ export function main() {
}); });
}); });
} }
class TestFixture {
constructor(public compFactory: ComponentFactory<CompA>, public name: string) {}
}

View File

@ -50,7 +50,7 @@ export function main() {
describe("bootstrap", () => { describe("bootstrap", () => {
var platform: PlatformRef; var platform: PlatformRef;
var errorLogger: _ArrayLogger; var errorLogger: _ArrayLogger;
var someCompFactory: ComponentFactory; var someCompFactory: ComponentFactory<any>;
beforeEach(() => { beforeEach(() => {
errorLogger = new _ArrayLogger(); errorLogger = new _ArrayLogger();
@ -153,24 +153,24 @@ class _ArrayLogger {
logGroupEnd(){}; logGroupEnd(){};
} }
class _MockComponentFactory extends ComponentFactory { class _MockComponentFactory extends ComponentFactory<any> {
constructor(private _compRef: ComponentRef) { super(null, null, null); } constructor(private _compRef: ComponentRef<any>) { super(null, null, null); }
create(injector: Injector, projectableNodes: any[][] = null, create(injector: Injector, projectableNodes: any[][] = null,
rootSelectorOrNode: string | any = null): ComponentRef { rootSelectorOrNode: string | any = null): ComponentRef<any> {
return this._compRef; return this._compRef;
} }
} }
class _MockComponentResolver implements ComponentResolver { class _MockComponentResolver implements ComponentResolver {
constructor(private _compFactory: ComponentFactory) {} constructor(private _compFactory: ComponentFactory<any>) {}
resolveComponent(type: Type): Promise<ComponentFactory> { resolveComponent(type: Type): Promise<ComponentFactory<any>> {
return PromiseWrapper.resolve(this._compFactory); return PromiseWrapper.resolve(this._compFactory);
} }
clearCache() {} clearCache() {}
} }
class _MockComponentRef extends ComponentRef_ { class _MockComponentRef extends ComponentRef_<any> {
constructor(private _injector: Injector) { super(null, null); } constructor(private _injector: Injector) { super(null, null); }
get injector(): Injector { return this._injector; } get injector(): Injector { return this._injector; }
get changeDetectorRef(): ChangeDetectorRef { return <any>new SpyChangeDetectorRef(); } get changeDetectorRef(): ChangeDetectorRef { return <any>new SpyChangeDetectorRef(); }

View File

@ -82,7 +82,7 @@ export function main() {
var directiveLog: DirectiveLog; var directiveLog: DirectiveLog;
function createCompFixture(template: string, compType: Type = TestComponent, function createCompFixture(template: string, compType: Type = TestComponent,
_tcb: TestComponentBuilder = null): ComponentFixture { _tcb: TestComponentBuilder = null): ComponentFixture<any> {
if (isBlank(_tcb)) { if (isBlank(_tcb)) {
_tcb = tcb; _tcb = tcb;
} }
@ -98,12 +98,14 @@ export function main() {
return nodes.map(node => node.inject(dirType)); return nodes.map(node => node.inject(dirType));
} }
function _bindSimpleProp(bindAttr: string, compType: Type = TestComponent): ComponentFixture { function _bindSimpleProp(bindAttr: string,
compType: Type = TestComponent): ComponentFixture<any> {
var template = `<div ${bindAttr}></div>`; var template = `<div ${bindAttr}></div>`;
return createCompFixture(template, compType); return createCompFixture(template, compType);
} }
function _bindSimpleValue(expression: any, compType: Type = TestComponent): ComponentFixture { function _bindSimpleValue(expression: any,
compType: Type = TestComponent): ComponentFixture<any> {
return _bindSimpleProp(`[someProp]='${expression}'`, compType); return _bindSimpleProp(`[someProp]='${expression}'`, compType);
} }
@ -640,7 +642,7 @@ export function main() {
}); });
describe('lifecycle', () => { describe('lifecycle', () => {
function createCompWithContentAndViewChild(): ComponentFixture { function createCompWithContentAndViewChild(): ComponentFixture<any> {
return createCompFixture( return createCompFixture(
'<div testDirective="parent"><div *ngIf="true" testDirective="contentChild"></div><other-cmp></other-cmp></div>', '<div testDirective="parent"><div *ngIf="true" testDirective="contentChild"></div><other-cmp></other-cmp></div>',
TestComponent, TestComponent,

View File

@ -94,7 +94,7 @@ export function main() {
it('should leave the view tree in a consistent state if hydration fails', it('should leave the view tree in a consistent state if hydration fails',
inject([DynamicComponentLoader, TestComponentBuilder, AsyncTestCompleter], inject([DynamicComponentLoader, TestComponentBuilder, AsyncTestCompleter],
(loader: DynamicComponentLoader, tcb: TestComponentBuilder, async) => { (loader: DynamicComponentLoader, tcb: TestComponentBuilder, async) => {
tcb.createAsync(MyComp).then((tc: ComponentFixture) => { tcb.createAsync(MyComp).then((tc: ComponentFixture<any>) => {
tc.detectChanges(); tc.detectChanges();
PromiseWrapper.catchError( PromiseWrapper.catchError(
loader.loadNextToLocation(DynamicallyLoadedThrows, loader.loadNextToLocation(DynamicallyLoadedThrows,
@ -146,7 +146,7 @@ export function main() {
DOM.appendChild(doc.body, rootEl); DOM.appendChild(doc.body, rootEl);
loader.loadAsRoot(ChildComp, null, injector) loader.loadAsRoot(ChildComp, null, injector)
.then((componentRef) => { .then((componentRef) => {
var el = new ComponentFixture(componentRef, null, false); var el = new ComponentFixture<any>(componentRef, null, false);
expect(rootEl.parentNode).toBe(doc.body); expect(rootEl.parentNode).toBe(doc.body);

View File

@ -770,14 +770,13 @@ function declareTests(isJit: boolean) {
it("should allow to destroy a component from within a host event handler", it("should allow to destroy a component from within a host event handler",
fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => {
var fixture: ComponentFixture; let fixture =
tcb.overrideView(MyComp, new ViewMetadata({ tcb.overrideView(
MyComp, new ViewMetadata({
template: '<push-cmp-with-host-event></push-cmp-with-host-event>', template: '<push-cmp-with-host-event></push-cmp-with-host-event>',
directives: [[[PushCmpWithHostEvent]]] directives: [[[PushCmpWithHostEvent]]]
})) }))
.createFakeAsync(MyComp);
.createAsync(MyComp)
.then(root => { fixture = root; });
tick(); tick();
fixture.detectChanges(); fixture.detectChanges();
@ -865,8 +864,7 @@ function declareTests(isJit: boolean) {
directives: [[[PushCmpWithAsyncPipe]]] directives: [[[PushCmpWithAsyncPipe]]]
})); }));
var fixture: ComponentFixture; let fixture = tcb.createFakeAsync(MyComp);
tcb.createAsync(MyComp).then(root => { fixture = root; });
tick(); tick();
var cmp: PushCmpWithAsyncPipe = fixture.debugElement.children[0].references['cmp']; var cmp: PushCmpWithAsyncPipe = fixture.debugElement.children[0].references['cmp'];
@ -1500,8 +1498,7 @@ function declareTests(isJit: boolean) {
directives: [DirectiveEmittingEvent, DirectiveListeningEvent] directives: [DirectiveEmittingEvent, DirectiveListeningEvent]
})); }));
var fixture: ComponentFixture; let fixture = tcb.createFakeAsync(MyComp);
tcb.createAsync(MyComp).then(root => { fixture = root; });
tick(); tick();
var tc = fixture.debugElement.children[0]; var tc = fixture.debugElement.children[0];
@ -1606,7 +1603,7 @@ function declareTests(isJit: boolean) {
directives: [SomeImperativeViewport] directives: [SomeImperativeViewport]
})) }))
.createAsync(MyComp) .createAsync(MyComp)
.then((fixture: ComponentFixture) => { .then((fixture: ComponentFixture<any>) => {
fixture.detectChanges(); fixture.detectChanges();
expect(anchorElement).toHaveText(''); expect(anchorElement).toHaveText('');
@ -1828,8 +1825,7 @@ function declareTests(isJit: boolean) {
directives: [DirectiveWithPropDecorators] directives: [DirectiveWithPropDecorators]
})); }));
var fixture: ComponentFixture; let fixture = tcb.createFakeAsync(MyComp);
tcb.createAsync(MyComp).then(root => { fixture = root; });
tick(); tick();
var emitter = fixture.debugElement.children[0].inject(DirectiveWithPropDecorators); var emitter = fixture.debugElement.children[0].inject(DirectiveWithPropDecorators);

View File

@ -293,7 +293,7 @@ export function main() {
{template: '<simple stringProp="text"></simple>', directives: [Simple]})) {template: '<simple stringProp="text"></simple>', directives: [Simple]}))
.overrideTemplate(Simple, '<ng-content></ng-content><p>P,</p>{{stringProp}}') .overrideTemplate(Simple, '<ng-content></ng-content><p>P,</p>{{stringProp}}')
.createAsync(MainComp) .createAsync(MainComp)
.then((main: ComponentFixture) => { .then((main: ComponentFixture<any>) => {
main.detectChanges(); main.detectChanges();
@ -314,7 +314,7 @@ export function main() {
{template: '<simple stringProp="text"></simple>', directives: [Simple]})) {template: '<simple stringProp="text"></simple>', directives: [Simple]}))
.overrideTemplate(Simple, '<style></style><p>P,</p>{{stringProp}}') .overrideTemplate(Simple, '<style></style><p>P,</p>{{stringProp}}')
.createAsync(MainComp) .createAsync(MainComp)
.then((main: ComponentFixture) => { .then((main: ComponentFixture<any>) => {
main.detectChanges(); main.detectChanges();
expect(main.debugElement.nativeElement).toHaveText('P,text'); expect(main.debugElement.nativeElement).toHaveText('P,text');

View File

@ -35,7 +35,7 @@ export function main() {
it('should read the template from an annotation', it('should read the template from an annotation',
inject([AsyncTestCompleter, ComponentResolver], (async, compiler: ComponentResolver) => { inject([AsyncTestCompleter, ComponentResolver], (async, compiler: ComponentResolver) => {
compiler.resolveComponent(SomeComponent) compiler.resolveComponent(SomeComponent)
.then((compFactory: ComponentFactory) => { .then((compFactory: ComponentFactory<any>) => {
expect(compFactory).toBe(someCompFactory); expect(compFactory).toBe(someCompFactory);
async.done(); async.done();
return null; return null;

View File

@ -274,7 +274,7 @@ export function main() {
var tcb: TestComponentBuilder; var tcb: TestComponentBuilder;
function createCompFixture(template: string, tcb: TestComponentBuilder, function createCompFixture(template: string, tcb: TestComponentBuilder,
comp: Type = null): ComponentFixture { comp: Type = null): ComponentFixture<any> {
if (isBlank(comp)) { if (isBlank(comp)) {
comp = TestComp; comp = TestComp;
} }

View File

@ -262,11 +262,11 @@ export function main() {
it('should register each application with the testability registry', it('should register each application with the testability registry',
inject([AsyncTestCompleter], (async) => { inject([AsyncTestCompleter], (async) => {
var refPromise1: Promise<ComponentRef> = bootstrap(HelloRootCmp, testProviders); var refPromise1: Promise<ComponentRef<any>> = bootstrap(HelloRootCmp, testProviders);
var refPromise2: Promise<ComponentRef> = bootstrap(HelloRootCmp2, testProviders); var refPromise2: Promise<ComponentRef<any>> = bootstrap(HelloRootCmp2, testProviders);
PromiseWrapper.all([refPromise1, refPromise2]) PromiseWrapper.all([refPromise1, refPromise2])
.then((refs: ComponentRef[]) => { .then((refs: ComponentRef<any>[]) => {
var registry = refs[0].injector.get(TestabilityRegistry); var registry = refs[0].injector.get(TestabilityRegistry);
var testabilities = var testabilities =
[refs[0].injector.get(Testability), refs[1].injector.get(Testability)]; [refs[0].injector.get(Testability), refs[1].injector.get(Testability)];

View File

@ -11,7 +11,7 @@ class SpyApplicationRef extends SpyObject implements ApplicationRef {
} }
@proxy @proxy
class SpyComponentRef extends SpyObject implements ComponentRef { class SpyComponentRef extends SpyObject implements ComponentRef<dynamic> {
Injector injector; Injector injector;
SpyComponentRef() { SpyComponentRef() {

View File

@ -59,8 +59,7 @@ export function main() {
it('should allow fakeAsync Tests to load components with templateUrl synchronously', it('should allow fakeAsync Tests to load components with templateUrl synchronously',
fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => {
let fixture: ComponentFixture; let fixture = tcb.createFakeAsync(TestComponent);
tcb.createAsync(TestComponent).then((f) => { fixture = f; });
// This should initialize the fixture. // This should initialize the fixture.
tick(); tick();

View File

@ -35,7 +35,7 @@ import {
asyncRouteDataCmp asyncRouteDataCmp
} from './fixture_components'; } from './fixture_components';
function getLinkElement(rtc: ComponentFixture) { function getLinkElement(rtc: ComponentFixture<any>) {
return rtc.debugElement.query(By.css('a')).nativeElement; return rtc.debugElement.query(By.css('a')).nativeElement;
} }

View File

@ -30,13 +30,13 @@ import {
import {specs, compile, clickOnElement, getHref} from '../util'; import {specs, compile, clickOnElement, getHref} from '../util';
import {BaseException} from 'angular2/src/facade/exceptions'; import {BaseException} from 'angular2/src/facade/exceptions';
function getLinkElement(rtc: ComponentFixture, linkIndex: number = 0) { function getLinkElement(rtc: ComponentFixture<any>, linkIndex: number = 0) {
return rtc.debugElement.queryAll(By.css('a'))[linkIndex].nativeElement; return rtc.debugElement.queryAll(By.css('a'))[linkIndex].nativeElement;
} }
function auxRoutes() { function auxRoutes() {
var tcb: TestComponentBuilder; var tcb: TestComponentBuilder;
var fixture: ComponentFixture; var fixture: ComponentFixture<any>;
var rtr; var rtr;
beforeEach(inject([TestComponentBuilder, Router], (tcBuilder, router) => { beforeEach(inject([TestComponentBuilder, Router], (tcBuilder, router) => {
@ -139,7 +139,7 @@ function auxRoutes() {
function auxRoutesWithAPrimaryRoute() { function auxRoutesWithAPrimaryRoute() {
var tcb: TestComponentBuilder; var tcb: TestComponentBuilder;
var fixture: ComponentFixture; var fixture: ComponentFixture<any>;
var rtr; var rtr;
beforeEach(inject([TestComponentBuilder, Router], (tcBuilder, router) => { beforeEach(inject([TestComponentBuilder, Router], (tcBuilder, router) => {

View File

@ -142,7 +142,7 @@ export class RedirectToParentCmp {
@Component({selector: 'dynamic-loader-cmp', template: `{ <div #viewport></div> }`}) @Component({selector: 'dynamic-loader-cmp', template: `{ <div #viewport></div> }`})
@RouteConfig([new Route({path: '/', component: HelloCmp})]) @RouteConfig([new Route({path: '/', component: HelloCmp})])
export class DynamicLoaderCmp { export class DynamicLoaderCmp {
private _componentRef: ComponentRef = null; private _componentRef: ComponentRef<any> = null;
@ViewChild('viewport', {read: ViewContainerRef}) viewport: ViewContainerRef; @ViewChild('viewport', {read: ViewContainerRef}) viewport: ViewContainerRef;

View File

@ -30,7 +30,7 @@ import {
import {PromiseWrapper} from 'angular2/src/facade/async'; import {PromiseWrapper} from 'angular2/src/facade/async';
function getLinkElement(rtc: ComponentFixture) { function getLinkElement(rtc: ComponentFixture<any>) {
return rtc.debugElement.query(By.css('a')).nativeElement; return rtc.debugElement.query(By.css('a')).nativeElement;
} }
@ -431,7 +431,7 @@ function syncRoutesWithSyncChildrenWithDefaultRoutesWithoutParams() {
} }
function syncRoutesWithDynamicComponents() { function syncRoutesWithDynamicComponents() {
var fixture: ComponentFixture; var fixture: ComponentFixture<any>;
var tcb: TestComponentBuilder; var tcb: TestComponentBuilder;
var rtr: Router; var rtr: Router;

View File

@ -55,7 +55,7 @@ export function main() {
describe('Router lifecycle hooks', () => { describe('Router lifecycle hooks', () => {
var tcb: TestComponentBuilder; var tcb: TestComponentBuilder;
var fixture: ComponentFixture; var fixture: ComponentFixture<any>;
var rtr: Router; var rtr: Router;
beforeEachProviders(() => TEST_ROUTER_PROVIDERS); beforeEachProviders(() => TEST_ROUTER_PROVIDERS);

View File

@ -37,7 +37,7 @@ export function main() {
describe('navigation', () => { describe('navigation', () => {
var tcb: TestComponentBuilder; var tcb: TestComponentBuilder;
var fixture: ComponentFixture; var fixture: ComponentFixture<any>;
var rtr; var rtr;
beforeEachProviders(() => TEST_ROUTER_PROVIDERS); beforeEachProviders(() => TEST_ROUTER_PROVIDERS);

View File

@ -35,7 +35,7 @@ export function main() {
describe('redirects', () => { describe('redirects', () => {
var tcb: TestComponentBuilder; var tcb: TestComponentBuilder;
var rootTC: ComponentFixture; var rootTC: ComponentFixture<any>;
var rtr; var rtr;
beforeEachProviders(() => TEST_ROUTER_PROVIDERS); beforeEachProviders(() => TEST_ROUTER_PROVIDERS);

View File

@ -47,7 +47,7 @@ import {RouterLinkTransform} from 'angular2/src/router/directives/router_link_tr
export function main() { export function main() {
describe('routerLink directive', function() { describe('routerLink directive', function() {
var tcb: TestComponentBuilder; var tcb: TestComponentBuilder;
var fixture: ComponentFixture; var fixture: ComponentFixture<any>;
var router: Router; var router: Router;
var location: Location; var location: Location;
@ -373,7 +373,7 @@ export function main() {
}); });
} }
function getHref(tc: ComponentFixture) { function getHref(tc: ComponentFixture<any>) {
return DOM.getAttribute(tc.debugElement.query(By.css('a')).nativeElement, 'href'); return DOM.getAttribute(tc.debugElement.query(By.css('a')).nativeElement, 'href');
} }

View File

@ -17,7 +17,7 @@ import {
ComponentFixtureNoNgZone ComponentFixtureNoNgZone
} from 'angular2/testing_internal'; } from 'angular2/testing_internal';
import {Injectable, provide} from 'angular2/core'; import {Injectable, provide, ComponentResolver} from 'angular2/core';
import {NgIf} from 'angular2/common'; import {NgIf} from 'angular2/common';
import {Directive, Component, ViewMetadata, Input} from 'angular2/src/core/metadata'; import {Directive, Component, ViewMetadata, Input} from 'angular2/src/core/metadata';
import {IS_DART} from 'angular2/src/facade/lang'; import {IS_DART} from 'angular2/src/facade/lang';
@ -460,6 +460,27 @@ export function main() {
}); });
})); }));
}); });
describe('createSync', () => {
it('should create components',
inject([ComponentResolver, TestComponentBuilder, AsyncTestCompleter],
(cr: ComponentResolver, tcb: TestComponentBuilder, async) => {
cr.resolveComponent(MyIfComp).then((cmpFactory) => {
let componentFixture = tcb.createSync(cmpFactory);
componentFixture.detectChanges();
expect(componentFixture.nativeElement).toHaveText('MyIf()');
componentFixture.componentInstance.showMore = true;
componentFixture.detectChanges();
expect(componentFixture.nativeElement).toHaveText('MyIf(More)');
async.done();
});
}));
});
}); });
} }
}); });

View File

@ -120,7 +120,7 @@ export function main() {
return uiRenderStore.deserialize(id); return uiRenderStore.deserialize(id);
} }
function getRenderer(componentRef: ComponentRef) { function getRenderer(componentRef: ComponentRef<any>) {
return (<any>componentRef.hostView).internalView.renderer; return (<any>componentRef.hostView).internalView.renderer;
} }

View File

@ -29,11 +29,11 @@ const CORE = [
'AfterViewInit', 'AfterViewInit',
'AfterViewInit.ngAfterViewInit():any', 'AfterViewInit.ngAfterViewInit():any',
'ApplicationRef', 'ApplicationRef',
'ApplicationRef.bootstrap(componentFactory:ComponentFactory):ComponentRef', 'ApplicationRef.bootstrap(componentFactory:ComponentFactory<C>):ComponentRef<C>',
'ApplicationRef.componentTypes:Type[]', 'ApplicationRef.componentTypes:Type[]',
'ApplicationRef.dispose():void', 'ApplicationRef.dispose():void',
'ApplicationRef.injector:Injector', 'ApplicationRef.injector:Injector',
'ApplicationRef.registerBootstrapListener(listener:(ref: ComponentRef) => void):void', 'ApplicationRef.registerBootstrapListener(listener:(ref: ComponentRef<any>) => void):void',
'ApplicationRef.registerDisposeListener(dispose:() => void):void', 'ApplicationRef.registerDisposeListener(dispose:() => void):void',
'ApplicationRef.tick():void', 'ApplicationRef.tick():void',
'ApplicationRef.run(callback:Function):any', 'ApplicationRef.run(callback:Function):any',
@ -74,7 +74,7 @@ const CORE = [
'CollectionChangeRecord.toString():string', 'CollectionChangeRecord.toString():string',
'ComponentResolver', 'ComponentResolver',
'ComponentResolver.clearCache():any', 'ComponentResolver.clearCache():any',
'ComponentResolver.resolveComponent(componentType:Type):Promise<ComponentFactory>', 'ComponentResolver.resolveComponent(componentType:Type):Promise<ComponentFactory<any>>',
'ComponentDecorator', 'ComponentDecorator',
'ComponentDecorator.View(obj:{templateUrl?:string, template?:string, directives?:Array<Type|any[]>, pipes?:Array<Type|any[]>, renderer?:string, styles?:string[], styleUrls?:string[]}):ViewDecorator', 'ComponentDecorator.View(obj:{templateUrl?:string, template?:string, directives?:Array<Type|any[]>, pipes?:Array<Type|any[]>, renderer?:string, styles?:string[], styleUrls?:string[]}):ViewDecorator',
'ComponentMetadataFactory', 'ComponentMetadataFactory',
@ -91,10 +91,10 @@ const CORE = [
'ComponentMetadata.templateUrl:string', 'ComponentMetadata.templateUrl:string',
'ComponentMetadata.viewBindings:any[]', 'ComponentMetadata.viewBindings:any[]',
'ComponentMetadata.viewProviders:any[]', 'ComponentMetadata.viewProviders:any[]',
'ComponentRef', 'ComponentRef<C>',
'ComponentRef.componentType:Type', 'ComponentRef.componentType:Type',
'ComponentRef.injector:Injector', 'ComponentRef.injector:Injector',
'ComponentRef.instance:any', 'ComponentRef.instance:C',
'ComponentRef.location:ElementRef', 'ComponentRef.location:ElementRef',
'ComponentRef.destroy():void', 'ComponentRef.destroy():void',
'ComponentRef.hostView:ViewRef', 'ComponentRef.hostView:ViewRef',
@ -159,8 +159,8 @@ const CORE = [
'DoCheck', 'DoCheck',
'DoCheck.ngDoCheck():any', 'DoCheck.ngDoCheck():any',
'DynamicComponentLoader', 'DynamicComponentLoader',
'DynamicComponentLoader.loadAsRoot(type:Type, overrideSelectorOrNode:string|any, injector:Injector, onDispose:() => void, projectableNodes:any[][]):Promise<ComponentRef>', 'DynamicComponentLoader.loadAsRoot(type:Type, overrideSelectorOrNode:string|any, injector:Injector, onDispose:() => void, projectableNodes:any[][]):Promise<ComponentRef<any>>',
'DynamicComponentLoader.loadNextToLocation(type:Type, location:ViewContainerRef, providers:ResolvedReflectiveProvider[], projectableNodes:any[][]):Promise<ComponentRef>', 'DynamicComponentLoader.loadNextToLocation(type:Type, location:ViewContainerRef, providers:ResolvedReflectiveProvider[], projectableNodes:any[][]):Promise<ComponentRef<any>>',
'ElementRef', 'ElementRef',
'ElementRef.nativeElement:any', 'ElementRef.nativeElement:any',
'ElementRef.constructor(nativeElement:any)', 'ElementRef.constructor(nativeElement:any)',
@ -192,10 +192,10 @@ const CORE = [
'HostListenerMetadata.constructor(eventName:string, args:string[])', 'HostListenerMetadata.constructor(eventName:string, args:string[])',
'HostMetadata', 'HostMetadata',
'HostMetadata.toString():string', 'HostMetadata.toString():string',
'ComponentFactory', 'ComponentFactory<C>',
'ComponentFactory.componentType:Type', 'ComponentFactory.componentType:Type',
'ComponentFactory.constructor(selector:string, _viewFactory:Function, _componentType:Type)', 'ComponentFactory.constructor(selector:string, _viewFactory:Function, _componentType:Type)',
'ComponentFactory.create(injector:Injector, projectableNodes:any[][], rootSelectorOrNode:string|any):ComponentRef', 'ComponentFactory.create(injector:Injector, projectableNodes:any[][], rootSelectorOrNode:string|any):ComponentRef<C>',
'InjectMetadataFactory', 'InjectMetadataFactory',
'InjectMetadata', 'InjectMetadata',
'InjectMetadata.constructor(token:any)', 'InjectMetadata.constructor(token:any)',
@ -445,8 +445,8 @@ const CORE = [
'ViewChildrenMetadata.constructor(_selector:Type|string, {read=null}:{read?:any})', 'ViewChildrenMetadata.constructor(_selector:Type|string, {read=null}:{read?:any})',
'ViewContainerRef', 'ViewContainerRef',
'ViewContainerRef.clear():void', 'ViewContainerRef.clear():void',
'ViewContainerRef.createEmbeddedView(templateRef:TemplateRef<any>, context:any, index:number):EmbeddedViewRef<any>', 'ViewContainerRef.createEmbeddedView(templateRef:TemplateRef<C>, context:C, index:number):EmbeddedViewRef<C>',
'ViewContainerRef.createComponent(componentFactory:ComponentFactory, index:number, injector:Injector, projectableNodes:any[][]):ComponentRef', 'ViewContainerRef.createComponent(componentFactory:ComponentFactory<C>, index:number, injector:Injector, projectableNodes:any[][]):ComponentRef<C>',
'ViewContainerRef.detach(index:number):ViewRef', 'ViewContainerRef.detach(index:number):ViewRef',
'ViewContainerRef.element:ElementRef', 'ViewContainerRef.element:ElementRef',
'ViewContainerRef.injector:Injector', 'ViewContainerRef.injector:Injector',
@ -503,8 +503,8 @@ const CORE = [
'createNgZone():NgZone', 'createNgZone():NgZone',
'enableProdMode():any', 'enableProdMode():any',
'forwardRef(forwardRefFn:ForwardRefFn):Type', 'forwardRef(forwardRefFn:ForwardRefFn):Type',
'coreBootstrap(injector:Injector, componentFactory:ComponentFactory):ComponentRef', 'coreBootstrap(injector:Injector, componentFactory:ComponentFactory<C>):ComponentRef<C>',
'coreLoadAndBootstrap(injector:Injector, componentType:Type):Promise<ComponentRef>', 'coreLoadAndBootstrap(injector:Injector, componentType:Type):Promise<ComponentRef<any>>',
'assertPlatform(requiredToken:any):PlatformRef', 'assertPlatform(requiredToken:any):PlatformRef',
'createPlatform(injector:Injector):PlatformRef', 'createPlatform(injector:Injector):PlatformRef',
'disposePlatform():void', 'disposePlatform():void',
@ -1208,13 +1208,13 @@ const BROWSER = [
'Title', 'Title',
'Title.getTitle():string', 'Title.getTitle():string',
'Title.setTitle(newTitle:string):any', 'Title.setTitle(newTitle:string):any',
'bootstrapStatic(appComponentType:Type, customProviders:Array<any>, initReflector:Function):Promise<ComponentRef>', 'bootstrapStatic(appComponentType:Type, customProviders:Array<any>, initReflector:Function):Promise<ComponentRef<any>>',
'const BROWSER_APP_PROVIDERS:Array<any>', 'const BROWSER_APP_PROVIDERS:Array<any>',
'const BROWSER_PROVIDERS:Array<any>', 'const BROWSER_PROVIDERS:Array<any>',
'const ELEMENT_PROBE_PROVIDERS:any[]', 'const ELEMENT_PROBE_PROVIDERS:any[]',
'const ELEMENT_PROBE_PROVIDERS_PROD_MODE:any[]', 'const ELEMENT_PROBE_PROVIDERS_PROD_MODE:any[]',
'disableDebugTools():void', 'disableDebugTools():void',
'enableDebugTools(ref:ComponentRef):void', 'enableDebugTools(ref:ComponentRef<any>):void',
'inspectNativeElement(element:any):DebugNode', 'inspectNativeElement(element:any):DebugNode',
'browserStaticPlatform():PlatformRef' 'browserStaticPlatform():PlatformRef'
]; ];