Skip to content

Instantly share code, notes, and snippets.

@vladimir-ivanov
Created February 21, 2016 00:21
Show Gist options
  • Save vladimir-ivanov/a9800ca6b39c677a1dbd to your computer and use it in GitHub Desktop.
Save vladimir-ivanov/a9800ca6b39c677a1dbd to your computer and use it in GitHub Desktop.
@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