perf(Compiler): do not resolve bindings for cached ProtoViews
This commit is contained in:
parent
0949a4b045
commit
7a7b3a6cb9
@ -2,6 +2,7 @@ import {Binding, resolveForwardRef, Injectable} from 'angular2/di';
|
|||||||
import {
|
import {
|
||||||
Type,
|
Type,
|
||||||
isBlank,
|
isBlank,
|
||||||
|
isType,
|
||||||
isPresent,
|
isPresent,
|
||||||
BaseException,
|
BaseException,
|
||||||
normalizeBlank,
|
normalizeBlank,
|
||||||
@ -103,16 +104,18 @@ export class Compiler {
|
|||||||
// Create a hostView as if the compiler encountered <hostcmp></hostcmp>.
|
// Create a hostView as if the compiler encountered <hostcmp></hostcmp>.
|
||||||
// Used for bootstrapping.
|
// Used for bootstrapping.
|
||||||
compileInHost(componentTypeOrBinding: Type | Binding): Promise<ProtoViewRef> {
|
compileInHost(componentTypeOrBinding: Type | Binding): Promise<ProtoViewRef> {
|
||||||
var componentBinding = this._bindDirective(componentTypeOrBinding);
|
var componentType = isType(componentTypeOrBinding) ? componentTypeOrBinding :
|
||||||
Compiler._assertTypeIsComponent(componentBinding);
|
(<Binding>componentTypeOrBinding).token;
|
||||||
|
|
||||||
var directiveMetadata = componentBinding.metadata;
|
var hostAppProtoView = this._compilerCache.getHost(componentType);
|
||||||
var hostPvPromise;
|
var hostPvPromise;
|
||||||
var component = <Type>componentBinding.key.token;
|
|
||||||
var hostAppProtoView = this._compilerCache.getHost(component);
|
|
||||||
if (isPresent(hostAppProtoView)) {
|
if (isPresent(hostAppProtoView)) {
|
||||||
hostPvPromise = PromiseWrapper.resolve(hostAppProtoView);
|
hostPvPromise = PromiseWrapper.resolve(hostAppProtoView);
|
||||||
} else {
|
} else {
|
||||||
|
var componentBinding = this._bindDirective(componentTypeOrBinding);
|
||||||
|
Compiler._assertTypeIsComponent(componentBinding);
|
||||||
|
|
||||||
|
var directiveMetadata = componentBinding.metadata;
|
||||||
hostPvPromise = this._render.compileHost(directiveMetadata)
|
hostPvPromise = this._render.compileHost(directiveMetadata)
|
||||||
.then((hostRenderPv) => {
|
.then((hostRenderPv) => {
|
||||||
return this._compileNestedProtoViews(componentBinding, hostRenderPv,
|
return this._compileNestedProtoViews(componentBinding, hostRenderPv,
|
||||||
|
@ -373,6 +373,26 @@ export function main() {
|
|||||||
});
|
});
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
it('should not bind directives for cached components', inject([AsyncTestCompleter], (async) => {
|
||||||
|
// set up the cache with the test proto view
|
||||||
|
var mainPv: AppProtoView = createProtoView();
|
||||||
|
var cache: CompilerCache = new CompilerCache();
|
||||||
|
cache.setHost(MainComponent, mainPv);
|
||||||
|
|
||||||
|
// create the spy resolver
|
||||||
|
var reader: any = new SpyDirectiveResolver();
|
||||||
|
|
||||||
|
// create the compiler
|
||||||
|
var compiler = new Compiler(reader, cache, tplResolver, cmpUrlMapper, new UrlResolver(),
|
||||||
|
renderCompiler, protoViewFactory, new FakeAppRootUrl());
|
||||||
|
compiler.compileInHost(MainComponent)
|
||||||
|
.then((protoViewRef) => {
|
||||||
|
// the test should have failed if the resolver was called, so we're good
|
||||||
|
async.done();
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
|
||||||
|
|
||||||
it('should cache compiled nested components', inject([AsyncTestCompleter], (async) => {
|
it('should cache compiled nested components', inject([AsyncTestCompleter], (async) => {
|
||||||
tplResolver.setView(MainComponent, new viewAnn.View({template: '<div></div>'}));
|
tplResolver.setView(MainComponent, new viewAnn.View({template: '<div></div>'}));
|
||||||
tplResolver.setView(MainComponent2, new viewAnn.View({template: '<div></div>'}));
|
tplResolver.setView(MainComponent2, new viewAnn.View({template: '<div></div>'}));
|
||||||
@ -563,6 +583,13 @@ class SpyRenderCompiler extends SpyObject {
|
|||||||
noSuchMethod(m) { return super.noSuchMethod(m) }
|
noSuchMethod(m) { return super.noSuchMethod(m) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@proxy
|
||||||
|
@IMPLEMENTS(DirectiveResolver)
|
||||||
|
class SpyDirectiveResolver extends SpyObject {
|
||||||
|
constructor() { super(DirectiveResolver); }
|
||||||
|
noSuchMethod(m) { return super.noSuchMethod(m) }
|
||||||
|
}
|
||||||
|
|
||||||
class FakeAppRootUrl extends AppRootUrl {
|
class FakeAppRootUrl extends AppRootUrl {
|
||||||
get value() { return 'http://www.app.com'; }
|
get value() { return 'http://www.app.com'; }
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user