UNPKG

angular2

Version:

Angular 2 - a web framework for modern web apps

757 lines 135 kB
import { isPresent, isBlank } from 'angular2/src/facade/lang'; import { BaseException } from 'angular2/src/facade/exceptions'; import { ListWrapper, StringMapWrapper } from 'angular2/src/facade/collection'; import { Injector, Key, Dependency, Provider, NoProviderError } from 'angular2/src/core/di'; import { mergeResolvedProviders } from 'angular2/src/core/di/provider'; import { UNDEFINED, ProtoInjector, Visibility, InjectorInlineStrategy, ProviderWithVisibility } from 'angular2/src/core/di/injector'; import { resolveProvider, ResolvedFactory, ResolvedProvider_ } from 'angular2/src/core/di/provider'; import { AttributeMetadata, QueryMetadata } from '../metadata/di'; import { ViewType } from './view_type'; import { ElementRef_ } from './element_ref'; import { ViewContainerRef } from './view_container_ref'; import { ElementRef } from './element_ref'; import { Renderer } from 'angular2/src/core/render/api'; import { TemplateRef, TemplateRef_ } from './template_ref'; import { DirectiveMetadata, ComponentMetadata } from '../metadata/directives'; import { ChangeDetectorRef } from 'angular2/src/core/change_detection/change_detection'; import { QueryList } from './query_list'; import { reflector } from 'angular2/src/core/reflection/reflection'; import { PipeProvider } from 'angular2/src/core/pipes/pipe_provider'; import { ViewContainerRef_ } from "./view_container_ref"; var _staticKeys; export class StaticKeys { constructor() { this.templateRefId = Key.get(TemplateRef).id; this.viewContainerId = Key.get(ViewContainerRef).id; this.changeDetectorRefId = Key.get(ChangeDetectorRef).id; this.elementRefId = Key.get(ElementRef).id; this.rendererId = Key.get(Renderer).id; } static instance() { if (isBlank(_staticKeys)) _staticKeys = new StaticKeys(); return _staticKeys; } } export class DirectiveDependency extends Dependency { constructor(key, optional, lowerBoundVisibility, upperBoundVisibility, properties, attributeName, queryDecorator) { super(key, optional, lowerBoundVisibility, upperBoundVisibility, properties); this.attributeName = attributeName; this.queryDecorator = queryDecorator; this._verify(); } /** @internal */ _verify() { var count = 0; if (isPresent(this.queryDecorator)) count++; if (isPresent(this.attributeName)) count++; if (count > 1) throw new BaseException('A directive injectable can contain only one of the following @Attribute or @Query.'); } static createFrom(d) { return new DirectiveDependency(d.key, d.optional, d.lowerBoundVisibility, d.upperBoundVisibility, d.properties, DirectiveDependency._attributeName(d.properties), DirectiveDependency._query(d.properties)); } /** @internal */ static _attributeName(properties) { var p = properties.find(p => p instanceof AttributeMetadata); return isPresent(p) ? p.attributeName : null; } /** @internal */ static _query(properties) { return properties.find(p => p instanceof QueryMetadata); } } export class DirectiveProvider extends ResolvedProvider_ { constructor(key, factory, deps, isComponent, providers, viewProviders, queries) { super(key, [new ResolvedFactory(factory, deps)], false); this.isComponent = isComponent; this.providers = providers; this.viewProviders = viewProviders; this.queries = queries; } get displayName() { return this.key.displayName; } static createFromType(type, meta) { var provider = new Provider(type, { useClass: type }); if (isBlank(meta)) { meta = new DirectiveMetadata(); } var rb = resolveProvider(provider); var rf = rb.resolvedFactories[0]; var deps = rf.dependencies.map(DirectiveDependency.createFrom); var isComponent = meta instanceof ComponentMetadata; var resolvedProviders = isPresent(meta.providers) ? Injector.resolve(meta.providers) : null; var resolvedViewProviders = meta instanceof ComponentMetadata && isPresent(meta.viewProviders) ? Injector.resolve(meta.viewProviders) : null; var queries = []; if (isPresent(meta.queries)) { StringMapWrapper.forEach(meta.queries, (meta, fieldName) => { var setter = reflector.setter(fieldName); queries.push(new QueryMetadataWithSetter(setter, meta)); }); } // queries passed into the constructor. // TODO: remove this after constructor queries are no longer supported deps.forEach(d => { if (isPresent(d.queryDecorator)) { queries.push(new QueryMetadataWithSetter(null, d.queryDecorator)); } }); return new DirectiveProvider(rb.key, rf.factory, deps, isComponent, resolvedProviders, resolvedViewProviders, queries); } } export class QueryMetadataWithSetter { constructor(setter, metadata) { this.setter = setter; this.metadata = metadata; } } function setProvidersVisibility(providers, visibility, result) { for (var i = 0; i < providers.length; i++) { result.set(providers[i].key.id, visibility); } } export class AppProtoElement { constructor(firstProviderIsComponent, index, attributes, pwvs, protoQueryRefs, directiveVariableBindings) { this.firstProviderIsComponent = firstProviderIsComponent; this.index = index; this.attributes = attributes; this.protoQueryRefs = protoQueryRefs; this.directiveVariableBindings = directiveVariableBindings; var length = pwvs.length; if (length > 0) { this.protoInjector = new ProtoInjector(pwvs); } else { this.protoInjector = null; this.protoQueryRefs = []; } } static create(metadataCache, index, attributes, directiveTypes, directiveVariableBindings) { var componentDirProvider = null; var mergedProvidersMap = new Map(); var providerVisibilityMap = new Map(); var providers = ListWrapper.createGrowableSize(directiveTypes.length); var protoQueryRefs = []; for (var i = 0; i < directiveTypes.length; i++) { var dirProvider = metadataCache.getResolvedDirectiveMetadata(directiveTypes[i]); providers[i] = new ProviderWithVisibility(dirProvider, dirProvider.isComponent ? Visibility.PublicAndPrivate : Visibility.Public); if (dirProvider.isComponent) { componentDirProvider = dirProvider; } else { if (isPresent(dirProvider.providers)) { mergeResolvedProviders(dirProvider.providers, mergedProvidersMap); setProvidersVisibility(dirProvider.providers, Visibility.Public, providerVisibilityMap); } } if (isPresent(dirProvider.viewProviders)) { mergeResolvedProviders(dirProvider.viewProviders, mergedProvidersMap); setProvidersVisibility(dirProvider.viewProviders, Visibility.Private, providerVisibilityMap); } for (var queryIdx = 0; queryIdx < dirProvider.queries.length; queryIdx++) { var q = dirProvider.queries[queryIdx]; protoQueryRefs.push(new ProtoQueryRef(i, q.setter, q.metadata)); } } if (isPresent(componentDirProvider) && isPresent(componentDirProvider.providers)) { // directive providers need to be prioritized over component providers mergeResolvedProviders(componentDirProvider.providers, mergedProvidersMap); setProvidersVisibility(componentDirProvider.providers, Visibility.Public, providerVisibilityMap); } mergedProvidersMap.forEach((provider, _) => { providers.push(new ProviderWithVisibility(provider, providerVisibilityMap.get(provider.key.id))); }); return new AppProtoElement(isPresent(componentDirProvider), index, attributes, providers, protoQueryRefs, directiveVariableBindings); } getProviderAtIndex(index) { return this.protoInjector.getProviderAtIndex(index); } } class _Context { constructor(element, componentElement, injector) { this.element = element; this.componentElement = componentElement; this.injector = injector; } } export class InjectorWithHostBoundary { constructor(injector, hostInjectorBoundary) { this.injector = injector; this.hostInjectorBoundary = hostInjectorBoundary; } } export class AppElement { constructor(proto, parentView, parent, nativeElement, embeddedViewFactory) { this.proto = proto; this.parentView = parentView; this.parent = parent; this.nativeElement = nativeElement; this.embeddedViewFactory = embeddedViewFactory; this.nestedViews = null; this.componentView = null; this.ref = new ElementRef_(this); var parentInjector = isPresent(parent) ? parent._injector : parentView.parentInjector; if (isPresent(this.proto.protoInjector)) { var isBoundary; if (isPresent(parent) && isPresent(parent.proto.protoInjector)) { isBoundary = false; } else { isBoundary = parentView.hostInjectorBoundary; } this._queryStrategy = this._buildQueryStrategy(); this._injector = new Injector(this.proto.protoInjector, parentInjector, isBoundary, this, () => this._debugContext()); // we couple ourselves to the injector strategy to avoid polymorphic calls var injectorStrategy = this._injector.internalStrategy; this._strategy = injectorStrategy instanceof InjectorInlineStrategy ? new ElementDirectiveInlineStrategy(injectorStrategy, this) : new ElementDirectiveDynamicStrategy(injectorStrategy, this); this._strategy.init(); } else { this._queryStrategy = null; this._injector = parentInjector; this._strategy = null; } } static getViewParentInjector(parentViewType, containerAppElement, imperativelyCreatedProviders, rootInjector) { var parentInjector; var hostInjectorBoundary; switch (parentViewType) { case ViewType.COMPONENT: parentInjector = containerAppElement._injector; hostInjectorBoundary = true; break; case ViewType.EMBEDDED: parentInjector = isPresent(containerAppElement.proto.protoInjector) ? containerAppElement._injector.parent : containerAppElement._injector; hostInjectorBoundary = containerAppElement._injector.hostBoundary; break; case ViewType.HOST: if (isPresent(containerAppElement)) { // host view is attached to a container parentInjector = isPresent(containerAppElement.proto.protoInjector) ? containerAppElement._injector.parent : containerAppElement._injector; if (isPresent(imperativelyCreatedProviders)) { var imperativeProvidersWithVisibility = imperativelyCreatedProviders.map(p => new ProviderWithVisibility(p, Visibility.Public)); // The imperative injector is similar to having an element between // the dynamic-loaded component and its parent => no boundary between // the component and imperativelyCreatedInjector. parentInjector = new Injector(new ProtoInjector(imperativeProvidersWithVisibility), parentInjector, true, null, null); hostInjectorBoundary = false; } else { hostInjectorBoundary = containerAppElement._injector.hostBoundary; } } else { // bootstrap parentInjector = rootInjector; hostInjectorBoundary = true; } break; } return new InjectorWithHostBoundary(parentInjector, hostInjectorBoundary); } attachComponentView(componentView) { this.componentView = componentView; } _debugContext() { var c = this.parentView.getDebugContext(this, null, null); return isPresent(c) ? new _Context(c.element, c.componentElement, c.injector) : null; } hasVariableBinding(name) { var vb = this.proto.directiveVariableBindings; return isPresent(vb) && StringMapWrapper.contains(vb, name); } getVariableBinding(name) { var index = this.proto.directiveVariableBindings[name]; return isPresent(index) ? this.getDirectiveAtIndex(index) : this.getElementRef(); } get(token) { return this._injector.get(token); } hasDirective(type) { return isPresent(this._injector.getOptional(type)); } getComponent() { return isPresent(this._strategy) ? this._strategy.getComponent() : null; } getInjector() { return this._injector; } getElementRef() { return this.ref; } getViewContainerRef() { return new ViewContainerRef_(this); } getTemplateRef() { if (isPresent(this.embeddedViewFactory)) { return new TemplateRef_(this.ref); } return null; } getDependency(injector, provider, dep) { if (provider instanceof DirectiveProvider) { var dirDep = dep; if (isPresent(dirDep.attributeName)) return this._buildAttribute(dirDep); if (isPresent(dirDep.queryDecorator)) return this._queryStrategy.findQuery(dirDep.queryDecorator).list; if (dirDep.key.id === StaticKeys.instance().changeDetectorRefId) { // We provide the component's view change detector to components and // the surrounding component's change detector to directives. if (this.proto.firstProviderIsComponent) { // Note: The component view is not yet created when // this method is called! return new _ComponentViewChangeDetectorRef(this); } else { return this.parentView.changeDetector.ref; } } if (dirDep.key.id === StaticKeys.instance().elementRefId) { return this.getElementRef(); } if (dirDep.key.id === StaticKeys.instance().viewContainerId) { return this.getViewContainerRef(); } if (dirDep.key.id === StaticKeys.instance().templateRefId) { var tr = this.getTemplateRef(); if (isBlank(tr) && !dirDep.optional) { throw new NoProviderError(null, dirDep.key); } return tr; } if (dirDep.key.id === StaticKeys.instance().rendererId) { return this.parentView.renderer; } } else if (provider instanceof PipeProvider) { if (dep.key.id === StaticKeys.instance().changeDetectorRefId) { // We provide the component's view change detector to components and // the surrounding component's change detector to directives. if (this.proto.firstProviderIsComponent) { // Note: The component view is not yet created when // this method is called! return new _ComponentViewChangeDetectorRef(this); } else { return this.parentView.changeDetector; } } } return UNDEFINED; } _buildAttribute(dep) { var attributes = this.proto.attributes; if (isPresent(attributes) && StringMapWrapper.contains(attributes, dep.attributeName)) { return attributes[dep.attributeName]; } else { return null; } } addDirectivesMatchingQuery(query, list) { var templateRef = this.getTemplateRef(); if (query.selector === TemplateRef && isPresent(templateRef)) { list.push(templateRef); } if (this._strategy != null) { this._strategy.addDirectivesMatchingQuery(query, list); } } _buildQueryStrategy() { if (this.proto.protoQueryRefs.length === 0) { return _emptyQueryStrategy; } else if (this.proto.protoQueryRefs.length <= InlineQueryStrategy.NUMBER_OF_SUPPORTED_QUERIES) { return new InlineQueryStrategy(this); } else { return new DynamicQueryStrategy(this); } } getDirectiveAtIndex(index) { return this._injector.getAt(index); } ngAfterViewChecked() { if (isPresent(this._queryStrategy)) this._queryStrategy.updateViewQueries(); } ngAfterContentChecked() { if (isPresent(this._queryStrategy)) this._queryStrategy.updateContentQueries(); } traverseAndSetQueriesAsDirty() { var inj = this; while (isPresent(inj)) { inj._setQueriesAsDirty(); if (isBlank(inj.parent) && inj.parentView.proto.type === ViewType.EMBEDDED) { inj = inj.parentView.containerAppElement; } else { inj = inj.parent; } } } _setQueriesAsDirty() { if (isPresent(this._queryStrategy)) { this._queryStrategy.setContentQueriesAsDirty(); } if (this.parentView.proto.type === ViewType.COMPONENT) { this.parentView.containerAppElement._queryStrategy.setViewQueriesAsDirty(); } } } class _EmptyQueryStrategy { setContentQueriesAsDirty() { } setViewQueriesAsDirty() { } updateContentQueries() { } updateViewQueries() { } findQuery(query) { throw new BaseException(`Cannot find query for directive ${query}.`); } } var _emptyQueryStrategy = new _EmptyQueryStrategy(); class InlineQueryStrategy { constructor(ei) { var protoRefs = ei.proto.protoQueryRefs; if (protoRefs.length > 0) this.query0 = new QueryRef(protoRefs[0], ei); if (protoRefs.length > 1) this.query1 = new QueryRef(protoRefs[1], ei); if (protoRefs.length > 2) this.query2 = new QueryRef(protoRefs[2], ei); } setContentQueriesAsDirty() { if (isPresent(this.query0) && !this.query0.isViewQuery) this.query0.dirty = true; if (isPresent(this.query1) && !this.query1.isViewQuery) this.query1.dirty = true; if (isPresent(this.query2) && !this.query2.isViewQuery) this.query2.dirty = true; } setViewQueriesAsDirty() { if (isPresent(this.query0) && this.query0.isViewQuery) this.query0.dirty = true; if (isPresent(this.query1) && this.query1.isViewQuery) this.query1.dirty = true; if (isPresent(this.query2) && this.query2.isViewQuery) this.query2.dirty = true; } updateContentQueries() { if (isPresent(this.query0) && !this.query0.isViewQuery) { this.query0.update(); } if (isPresent(this.query1) && !this.query1.isViewQuery) { this.query1.update(); } if (isPresent(this.query2) && !this.query2.isViewQuery) { this.query2.update(); } } updateViewQueries() { if (isPresent(this.query0) && this.query0.isViewQuery) { this.query0.update(); } if (isPresent(this.query1) && this.query1.isViewQuery) { this.query1.update(); } if (isPresent(this.query2) && this.query2.isViewQuery) { this.query2.update(); } } findQuery(query) { if (isPresent(this.query0) && this.query0.protoQueryRef.query === query) { return this.query0; } if (isPresent(this.query1) && this.query1.protoQueryRef.query === query) { return this.query1; } if (isPresent(this.query2) && this.query2.protoQueryRef.query === query) { return this.query2; } throw new BaseException(`Cannot find query for directive ${query}.`); } } InlineQueryStrategy.NUMBER_OF_SUPPORTED_QUERIES = 3; class DynamicQueryStrategy { constructor(ei) { this.queries = ei.proto.protoQueryRefs.map(p => new QueryRef(p, ei)); } setContentQueriesAsDirty() { for (var i = 0; i < this.queries.length; ++i) { var q = this.queries[i]; if (!q.isViewQuery) q.dirty = true; } } setViewQueriesAsDirty() { for (var i = 0; i < this.queries.length; ++i) { var q = this.queries[i]; if (q.isViewQuery) q.dirty = true; } } updateContentQueries() { for (var i = 0; i < this.queries.length; ++i) { var q = this.queries[i]; if (!q.isViewQuery) { q.update(); } } } updateViewQueries() { for (var i = 0; i < this.queries.length; ++i) { var q = this.queries[i]; if (q.isViewQuery) { q.update(); } } } findQuery(query) { for (var i = 0; i < this.queries.length; ++i) { var q = this.queries[i]; if (q.protoQueryRef.query === query) { return q; } } throw new BaseException(`Cannot find query for directive ${query}.`); } } /** * Strategy used by the `ElementInjector` when the number of providers is 10 or less. * In such a case, inlining fields is beneficial for performances. */ class ElementDirectiveInlineStrategy { constructor(injectorStrategy, _ei) { this.injectorStrategy = injectorStrategy; this._ei = _ei; } init() { var i = this.injectorStrategy; var p = i.protoStrategy; i.resetConstructionCounter(); if (p.provider0 instanceof DirectiveProvider && isPresent(p.keyId0) && i.obj0 === UNDEFINED) i.obj0 = i.instantiateProvider(p.provider0, p.visibility0); if (p.provider1 instanceof DirectiveProvider && isPresent(p.keyId1) && i.obj1 === UNDEFINED) i.obj1 = i.instantiateProvider(p.provider1, p.visibility1); if (p.provider2 instanceof DirectiveProvider && isPresent(p.keyId2) && i.obj2 === UNDEFINED) i.obj2 = i.instantiateProvider(p.provider2, p.visibility2); if (p.provider3 instanceof DirectiveProvider && isPresent(p.keyId3) && i.obj3 === UNDEFINED) i.obj3 = i.instantiateProvider(p.provider3, p.visibility3); if (p.provider4 instanceof DirectiveProvider && isPresent(p.keyId4) && i.obj4 === UNDEFINED) i.obj4 = i.instantiateProvider(p.provider4, p.visibility4); if (p.provider5 instanceof DirectiveProvider && isPresent(p.keyId5) && i.obj5 === UNDEFINED) i.obj5 = i.instantiateProvider(p.provider5, p.visibility5); if (p.provider6 instanceof DirectiveProvider && isPresent(p.keyId6) && i.obj6 === UNDEFINED) i.obj6 = i.instantiateProvider(p.provider6, p.visibility6); if (p.provider7 instanceof DirectiveProvider && isPresent(p.keyId7) && i.obj7 === UNDEFINED) i.obj7 = i.instantiateProvider(p.provider7, p.visibility7); if (p.provider8 instanceof DirectiveProvider && isPresent(p.keyId8) && i.obj8 === UNDEFINED) i.obj8 = i.instantiateProvider(p.provider8, p.visibility8); if (p.provider9 instanceof DirectiveProvider && isPresent(p.keyId9) && i.obj9 === UNDEFINED) i.obj9 = i.instantiateProvider(p.provider9, p.visibility9); } getComponent() { return this.injectorStrategy.obj0; } isComponentKey(key) { return this._ei.proto.firstProviderIsComponent && isPresent(key) && key.id === this.injectorStrategy.protoStrategy.keyId0; } addDirectivesMatchingQuery(query, list) { var i = this.injectorStrategy; var p = i.protoStrategy; if (isPresent(p.provider0) && p.provider0.key.token === query.selector) { if (i.obj0 === UNDEFINED) i.obj0 = i.instantiateProvider(p.provider0, p.visibility0); list.push(i.obj0); } if (isPresent(p.provider1) && p.provider1.key.token === query.selector) { if (i.obj1 === UNDEFINED) i.obj1 = i.instantiateProvider(p.provider1, p.visibility1); list.push(i.obj1); } if (isPresent(p.provider2) && p.provider2.key.token === query.selector) { if (i.obj2 === UNDEFINED) i.obj2 = i.instantiateProvider(p.provider2, p.visibility2); list.push(i.obj2); } if (isPresent(p.provider3) && p.provider3.key.token === query.selector) { if (i.obj3 === UNDEFINED) i.obj3 = i.instantiateProvider(p.provider3, p.visibility3); list.push(i.obj3); } if (isPresent(p.provider4) && p.provider4.key.token === query.selector) { if (i.obj4 === UNDEFINED) i.obj4 = i.instantiateProvider(p.provider4, p.visibility4); list.push(i.obj4); } if (isPresent(p.provider5) && p.provider5.key.token === query.selector) { if (i.obj5 === UNDEFINED) i.obj5 = i.instantiateProvider(p.provider5, p.visibility5); list.push(i.obj5); } if (isPresent(p.provider6) && p.provider6.key.token === query.selector) { if (i.obj6 === UNDEFINED) i.obj6 = i.instantiateProvider(p.provider6, p.visibility6); list.push(i.obj6); } if (isPresent(p.provider7) && p.provider7.key.token === query.selector) { if (i.obj7 === UNDEFINED) i.obj7 = i.instantiateProvider(p.provider7, p.visibility7); list.push(i.obj7); } if (isPresent(p.provider8) && p.provider8.key.token === query.selector) { if (i.obj8 === UNDEFINED) i.obj8 = i.instantiateProvider(p.provider8, p.visibility8); list.push(i.obj8); } if (isPresent(p.provider9) && p.provider9.key.token === query.selector) { if (i.obj9 === UNDEFINED) i.obj9 = i.instantiateProvider(p.provider9, p.visibility9); list.push(i.obj9); } } } /** * Strategy used by the `ElementInjector` when the number of bindings is 11 or more. * In such a case, there are too many fields to inline (see ElementInjectorInlineStrategy). */ class ElementDirectiveDynamicStrategy { constructor(injectorStrategy, _ei) { this.injectorStrategy = injectorStrategy; this._ei = _ei; } init() { var inj = this.injectorStrategy; var p = inj.protoStrategy; inj.resetConstructionCounter(); for (var i = 0; i < p.keyIds.length; i++) { if (p.providers[i] instanceof DirectiveProvider && isPresent(p.keyIds[i]) && inj.objs[i] === UNDEFINED) { inj.objs[i] = inj.instantiateProvider(p.providers[i], p.visibilities[i]); } } } getComponent() { return this.injectorStrategy.objs[0]; } isComponentKey(key) { var p = this.injectorStrategy.protoStrategy; return this._ei.proto.firstProviderIsComponent && isPresent(key) && key.id === p.keyIds[0]; } addDirectivesMatchingQuery(query, list) { var ist = this.injectorStrategy; var p = ist.protoStrategy; for (var i = 0; i < p.providers.length; i++) { if (p.providers[i].key.token === query.selector) { if (ist.objs[i] === UNDEFINED) { ist.objs[i] = ist.instantiateProvider(p.providers[i], p.visibilities[i]); } list.push(ist.objs[i]); } } } } export class ProtoQueryRef { constructor(dirIndex, setter, query) { this.dirIndex = dirIndex; this.setter = setter; this.query = query; } get usesPropertySyntax() { return isPresent(this.setter); } } export class QueryRef { constructor(protoQueryRef, originator) { this.protoQueryRef = protoQueryRef; this.originator = originator; this.list = new QueryList(); this.dirty = true; } get isViewQuery() { return this.protoQueryRef.query.isViewQuery; } update() { if (!this.dirty) return; this._update(); this.dirty = false; // TODO delete the check once only field queries are supported if (this.protoQueryRef.usesPropertySyntax) { var dir = this.originator.getDirectiveAtIndex(this.protoQueryRef.dirIndex); if (this.protoQueryRef.query.first) { this.protoQueryRef.setter(dir, this.list.length > 0 ? this.list.first : null); } else { this.protoQueryRef.setter(dir, this.list); } } this.list.notifyOnChanges(); } _update() { var aggregator = []; if (this.protoQueryRef.query.isViewQuery) { // intentionally skipping originator for view queries. var nestedView = this.originator.componentView; if (isPresent(nestedView)) this._visitView(nestedView, aggregator); } else { this._visit(this.originator, aggregator); } this.list.reset(aggregator); } ; _visit(inj, aggregator) { var view = inj.parentView; var startIdx = inj.proto.index; for (var i = startIdx; i < view.appElements.length; i++) { var curInj = view.appElements[i]; // The first injector after inj, that is outside the subtree rooted at // inj has to have a null parent or a parent that is an ancestor of inj. if (i > startIdx && (isBlank(curInj.parent) || curInj.parent.proto.index < startIdx)) { break; } if (!this.protoQueryRef.query.descendants && !(curInj.parent == this.originator || curInj == this.originator)) continue; // We visit the view container(VC) views right after the injector that contains // the VC. Theoretically, that might not be the right order if there are // child injectors of said injector. Not clear whether if such case can // even be constructed with the current apis. this._visitInjector(curInj, aggregator); this._visitViewContainerViews(curInj.nestedViews, aggregator); } } _visitInjector(inj, aggregator) { if (this.protoQueryRef.query.isVarBindingQuery) { this._aggregateVariableBinding(inj, aggregator); } else { this._aggregateDirective(inj, aggregator); } } _visitViewContainerViews(views, aggregator) { if (isPresent(views)) { for (var j = 0; j < views.length; j++) { this._visitView(views[j], aggregator); } } } _visitView(view, aggregator) { for (var i = 0; i < view.appElements.length; i++) { var inj = view.appElements[i]; this._visitInjector(inj, aggregator); this._visitViewContainerViews(inj.nestedViews, aggregator); } } _aggregateVariableBinding(inj, aggregator) { var vb = this.protoQueryRef.query.varBindings; for (var i = 0; i < vb.length; ++i) { if (inj.hasVariableBinding(vb[i])) { aggregator.push(inj.getVariableBinding(vb[i])); } } } _aggregateDirective(inj, aggregator) { inj.addDirectivesMatchingQuery(this.protoQueryRef.query, aggregator); } } class _ComponentViewChangeDetectorRef extends ChangeDetectorRef { constructor(_appElement) { super(); this._appElement = _appElement; } markForCheck() { this._appElement.componentView.changeDetector.ref.markForCheck(); } detach() { this._appElement.componentView.changeDetector.ref.detach(); } detectChanges() { this._appElement.componentView.changeDetector.ref.detectChanges(); } checkNoChanges() { this._appElement.componentView.changeDetector.ref.checkNoChanges(); } reattach() { this._appElement.componentView.changeDetector.ref.reattach(); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9lbGVtZW50LnRzIl0sIm5hbWVzIjpbIlN0YXRpY0tleXMiLCJTdGF0aWNLZXlzLmNvbnN0cnVjdG9yIiwiU3RhdGljS2V5cy5pbnN0YW5jZSIsIkRpcmVjdGl2ZURlcGVuZGVuY3kiLCJEaXJlY3RpdmVEZXBlbmRlbmN5LmNvbnN0cnVjdG9yIiwiRGlyZWN0aXZlRGVwZW5kZW5jeS5fdmVyaWZ5IiwiRGlyZWN0aXZlRGVwZW5kZW5jeS5jcmVhdGVGcm9tIiwiRGlyZWN0aXZlRGVwZW5kZW5jeS5fYXR0cmlidXRlTmFtZSIsIkRpcmVjdGl2ZURlcGVuZGVuY3kuX3F1ZXJ5IiwiRGlyZWN0aXZlUHJvdmlkZXIiLCJEaXJlY3RpdmVQcm92aWRlci5jb25zdHJ1Y3RvciIsIkRpcmVjdGl2ZVByb3ZpZGVyLmRpc3BsYXlOYW1lIiwiRGlyZWN0aXZlUHJvdmlkZXIuY3JlYXRlRnJvbVR5cGUiLCJRdWVyeU1ldGFkYXRhV2l0aFNldHRlciIsIlF1ZXJ5TWV0YWRhdGFXaXRoU2V0dGVyLmNvbnN0cnVjdG9yIiwic2V0UHJvdmlkZXJzVmlzaWJpbGl0eSIsIkFwcFByb3RvRWxlbWVudCIsIkFwcFByb3RvRWxlbWVudC5jb25zdHJ1Y3RvciIsIkFwcFByb3RvRWxlbWVudC5jcmVhdGUiLCJBcHBQcm90b0VsZW1lbnQuZ2V0UHJvdmlkZXJBdEluZGV4IiwiX0NvbnRleHQiLCJfQ29udGV4dC5jb25zdHJ1Y3RvciIsIkluamVjdG9yV2l0aEhvc3RCb3VuZGFyeSIsIkluamVjdG9yV2l0aEhvc3RCb3VuZGFyeS5jb25zdHJ1Y3RvciIsIkFwcEVsZW1lbnQiLCJBcHBFbGVtZW50LmNvbnN0cnVjdG9yIiwiQXBwRWxlbWVudC5nZXRWaWV3UGFyZW50SW5qZWN0b3IiLCJBcHBFbGVtZW50LmF0dGFjaENvbXBvbmVudFZpZXciLCJBcHBFbGVtZW50Ll9kZWJ1Z0NvbnRleHQiLCJBcHBFbGVtZW50Lmhhc1ZhcmlhYmxlQmluZGluZyIsIkFwcEVsZW1lbnQuZ2V0VmFyaWFibGVCaW5kaW5nIiwiQXBwRWxlbWVudC5nZXQiLCJBcHBFbGVtZW50Lmhhc0RpcmVjdGl2ZSIsIkFwcEVsZW1lbnQuZ2V0Q29tcG9uZW50IiwiQXBwRWxlbWVudC5nZXRJbmplY3RvciIsIkFwcEVsZW1lbnQuZ2V0RWxlbWVudFJlZiIsIkFwcEVsZW1lbnQuZ2V0Vmlld0NvbnRhaW5lclJlZiIsIkFwcEVsZW1lbnQuZ2V0VGVtcGxhdGVSZWYiLCJBcHBFbGVtZW50LmdldERlcGVuZGVuY3kiLCJBcHBFbGVtZW50Ll9idWlsZEF0dHJpYnV0ZSIsIkFwcEVsZW1lbnQuYWRkRGlyZWN0aXZlc01hdGNoaW5nUXVlcnkiLCJBcHBFbGVtZW50Ll9idWlsZFF1ZXJ5U3RyYXRlZ3kiLCJBcHBFbGVtZW50LmdldERpcmVjdGl2ZUF0SW5kZXgiLCJBcHBFbGVtZW50Lm5nQWZ0ZXJWaWV3Q2hlY2tlZCIsIkFwcEVsZW1lbnQubmdBZnRlckNvbnRlbnRDaGVja2VkIiwiQXBwRWxlbWVudC50cmF2ZXJzZUFuZFNldFF1ZXJpZXNBc0RpcnR5IiwiQXBwRWxlbWVudC5fc2V0UXVlcmllc0FzRGlydHkiLCJfRW1wdHlRdWVyeVN0cmF0ZWd5IiwiX0VtcHR5UXVlcnlTdHJhdGVneS5zZXRDb250ZW50UXVlcmllc0FzRGlydHkiLCJfRW1wdHlRdWVyeVN0cmF0ZWd5LnNldFZpZXdRdWVyaWVzQXNEaXJ0eSIsIl9FbXB0eVF1ZXJ5U3RyYXRlZ3kudXBkYXRlQ29udGVudFF1ZXJpZXMiLCJfRW1wdHlRdWVyeVN0cmF0ZWd5LnVwZGF0ZVZpZXdRdWVyaWVzIiwiX0VtcHR5UXVlcnlTdHJhdGVneS5maW5kUXVlcnkiLCJJbmxpbmVRdWVyeVN0cmF0ZWd5IiwiSW5saW5lUXVlcnlTdHJhdGVneS5jb25zdHJ1Y3RvciIsIklubGluZVF1ZXJ5U3RyYXRlZ3kuc2V0Q29udGVudFF1ZXJpZXNBc0RpcnR5IiwiSW5saW5lUXVlcnlTdHJhdGVneS5zZXRWaWV3UXVlcmllc0FzRGlydHkiLCJJbmxpbmVRdWVyeVN0cmF0ZWd5LnVwZGF0ZUNvbnRlbnRRdWVyaWVzIiwiSW5saW5lUXVlcnlTdHJhdGVneS51cGRhdGVWaWV3UXVlcmllcyIsIklubGluZVF1ZXJ5U3RyYXRlZ3kuZmluZFF1ZXJ5IiwiRHluYW1pY1F1ZXJ5U3RyYXRlZ3kiLCJEeW5hbWljUXVlcnlTdHJhdGVneS5jb25zdHJ1Y3RvciIsIkR5bmFtaWNRdWVyeVN0cmF0ZWd5LnNldENvbnRlbnRRdWVyaWVzQXNEaXJ0eSIsIkR5bmFtaWNRdWVyeVN0cmF0ZWd5LnNldFZpZXdRdWVyaWVzQXNEaXJ0eSIsIkR5bmFtaWNRdWVyeVN0cmF0ZWd5LnVwZGF0ZUNvbnRlbnRRdWVyaWVzIiwiRHluYW1pY1F1ZXJ5U3RyYXRlZ3kudXBkYXRlVmlld1F1ZXJpZXMiLCJEeW5hbWljUXVlcnlTdHJhdGVneS5maW5kUXVlcnkiLCJFbGVtZW50RGlyZWN0aXZlSW5saW5lU3RyYXRlZ3kiLCJFbGVtZW50RGlyZWN0aXZlSW5saW5lU3RyYXRlZ3kuY29uc3RydWN0b3IiLCJFbGVtZW50RGlyZWN0aXZlSW5saW5lU3RyYXRlZ3kuaW5pdCIsIkVsZW1lbnREaXJlY3RpdmVJbmxpbmVTdHJhdGVneS5nZXRDb21wb25lbnQiLCJFbGVtZW50RGlyZWN0aXZlSW5saW5lU3RyYXRlZ3kuaXNDb21wb25lbnRLZXkiLCJFbGVtZW50RGlyZWN0aXZlSW5saW5lU3RyYXRlZ3kuYWRkRGlyZWN0aXZlc01hdGNoaW5nUXVlcnkiLCJFbGVtZW50RGlyZWN0aXZlRHluYW1pY1N0cmF0ZWd5IiwiRWxlbWVudERpcmVjdGl2ZUR5bmFtaWNTdHJhdGVneS5jb25zdHJ1Y3RvciIsIkVsZW1lbnREaXJlY3RpdmVEeW5hbWljU3RyYXRlZ3kuaW5pdCIsIkVsZW1lbnREaXJlY3RpdmVEeW5hbWljU3RyYXRlZ3kuZ2V0Q29tcG9uZW50IiwiRWxlbWVudERpcmVjdGl2ZUR5bmFtaWNTdHJhdGVneS5pc0NvbXBvbmVudEtleSIsIkVsZW1lbnREaXJlY3RpdmVEeW5hbWljU3RyYXRlZ3kuYWRkRGlyZWN0aXZlc01hdGNoaW5nUXVlcnkiLCJQcm90b1F1ZXJ5UmVmIiwiUHJvdG9RdWVyeVJlZi5jb25zdHJ1Y3RvciIsIlByb3RvUXVlcnlSZWYudXNlc1Byb3BlcnR5U3ludGF4IiwiUXVlcnlSZWYiLCJRdWVyeVJlZi5jb25zdHJ1Y3RvciIsIlF1ZXJ5UmVmLmlzVmlld1F1ZXJ5IiwiUXVlcnlSZWYudXBkYXRlIiwiUXVlcnlSZWYuX3VwZGF0ZSIsIlF1ZXJ5UmVmLl92aXNpdCIsIlF1ZXJ5UmVmLl92aXNpdEluamVjdG9yIiwiUXVlcnlSZWYuX3Zpc2l0Vmlld0NvbnRhaW5lclZpZXdzIiwiUXVlcnlSZWYuX3Zpc2l0VmlldyIsIlF1ZXJ5UmVmLl9hZ2dyZWdhdGVWYXJpYWJsZUJpbmRpbmciLCJRdWVyeVJlZi5fYWdncmVnYXRlRGlyZWN0aXZlIiwiX0NvbXBvbmVudFZpZXdDaGFuZ2VEZXRlY3RvclJlZiIsIl9Db21wb25lbnRWaWV3Q2hhbmdlRGV0ZWN0b3JSZWYuY29uc3RydWN0b3IiLCJfQ29tcG9uZW50Vmlld0NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjayIsIl9Db21wb25lbnRWaWV3Q2hhbmdlRGV0ZWN0b3JSZWYuZGV0YWNoIiwiX0NvbXBvbmVudFZpZXdDaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzIiwiX0NvbXBvbmVudFZpZXdDaGFuZ2VEZXRlY3RvclJlZi5jaGVja05vQ2hhbmdlcyIsIl9Db21wb25lbnRWaWV3Q2hhbmdlRGV0ZWN0b3JSZWYucmVhdHRhY2giXSwibWFwcGluZ3MiOiJPQUFPLEVBQ0wsU0FBUyxFQUNULE9BQU8sRUFLUixNQUFNLDBCQUEwQjtPQUMxQixFQUFDLGFBQWEsRUFBQyxNQUFNLGdDQUFnQztPQUNyRCxFQUFDLFdBQVcsRUFBYyxnQkFBZ0IsRUFBQyxNQUFNLGdDQUFnQztPQUNqRixFQUNMLFFBQVEsRUFDUixHQUFHLEVBQ0gsVUFBVSxFQUVWLFFBQVEsRUFFUixlQUFlLEVB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