Created
February 21, 2016 00:21
-
-
Save vladimir-ivanov/a9800ca6b39c677a1dbd to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@Injectable() | |
export class RuntimeMetadataResolverWrapper extends RuntimeMetadataResolver { | |
directiveResolver; | |
viewResolver; | |
_directiveCache = new Map(); | |
constructor(_directiveResolver: DirectiveResolver, _pipeResolver: PipeResolver, | |
_viewResolver: ViewResolver, @Optional() @Inject(PLATFORM_DIRECTIVES) _platformDirectives, @Optional() @Inject(PLATFORM_PIPES) _platformPipes) { | |
super(_directiveResolver, _pipeResolver, _viewResolver, _platformDirectives, _platformPipes); | |
this.directiveResolver = _directiveResolver; | |
this.viewResolver = _viewResolver; | |
} | |
getDirectiveMetadata(directiveType) { | |
var meta = this._directiveCache.get(directiveType); | |
if (isBlank(meta)) { | |
var dirMeta = this.directiveResolver.resolve(directiveType); | |
var moduleUrl = null; | |
var templateMeta = null; | |
var changeDetectionStrategy = null; | |
if (dirMeta instanceof md.ComponentMetadata) { | |
var cmpMeta = <md.ComponentMetadata>dirMeta; | |
moduleUrl = calcModuleUrl(directiveType, cmpMeta); | |
var viewMeta = this.viewResolver.resolve(directiveType); | |
if (viewMeta.templateUrl && document.getElementById(viewMeta.templateUrl)) { | |
viewMeta.template = document.getElementById(viewMeta.templateUrl).innerHTML; | |
delete viewMeta.templateUrl; | |
} | |
templateMeta = new cpl.CompileTemplateMetadata({ | |
encapsulation: viewMeta.encapsulation, | |
template: viewMeta.template, | |
templateUrl: viewMeta.templateUrl, | |
styles: viewMeta.styles, | |
styleUrls: viewMeta.styleUrls | |
}); | |
changeDetectionStrategy = cmpMeta.changeDetection; | |
} | |
meta = cpl.CompileDirectiveMetadata.create({ | |
selector: dirMeta.selector, | |
exportAs: dirMeta.exportAs, | |
isComponent: isPresent(templateMeta), | |
dynamicLoadable: true, | |
type: new cpl.CompileTypeMetadata( | |
{name: stringify(directiveType), moduleUrl: moduleUrl, runtime: directiveType}), | |
template: templateMeta, | |
changeDetection: changeDetectionStrategy, | |
inputs: dirMeta.inputs, | |
outputs: dirMeta.outputs, | |
host: dirMeta.host, | |
lifecycleHooks: LIFECYCLE_HOOKS_VALUES.filter(hook => hasLifecycleHook(hook, directiveType)) | |
}); | |
this._directiveCache.set(directiveType, meta); | |
} | |
return meta; | |
} | |
} | |
function calcModuleUrl(type, cmpMetadata: md.ComponentMetadata): string { | |
var moduleId = cmpMetadata.moduleId; | |
if (isPresent(moduleId)) { | |
var scheme = getUrlScheme(moduleId); | |
return isPresent(scheme) && scheme.length > 0 ? moduleId : | |
`package:${moduleId}${MODULE_SUFFIX}`; | |
} else { | |
return reflector.importUri(type); | |
} | |
} | |
bootstrap( | |
RouterComponent, | |
[ | |
ROUTER_PROVIDERS, | |
provide(LocationStrategy, {useClass: HashLocationStrategy}), | |
provide(RuntimeMetadataResolver, {useClass: RuntimeMetadataResolverWrapper}), | |
Http, | |
HTTP_PROVIDERS, | |
FORM_DIRECTIVES | |
]); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment