Template as [removed] equivalent with angular 2

后端 未结 2 988
清歌不尽
清歌不尽 2021-02-05 17:27

Angularjs (e.g. angular 1) had this convenient behaviour of searching for a

2条回答
  •  萌比男神i
    2021-02-05 17:46

    I think a cleaner way for this would be if you provide your custom ViewResolver, inspired by the angular beta 17's source code, something in the lines of:

    import { Type, ViewMetadata, Reflector, Injectable, ComponentMetadata } from 'angular2/core';
    import { ViewResolver } from 'angular2/compiler';
    
    const SCRIPT_TYPE_NAME = 'text/ng2-template';
    
    @Injectable()
    export class CustomViewResolver extends ViewResolver 
    {
      constructor(private _r: Reflector){ super() }
      resolve(component: Type): ViewMetadata
      {
        let annotations = this._r.annotations(component);
        annotations.forEach( cm => 
        {
          if(cm instanceof ComponentMetadata && cm.templateUrl && typeof cm.templateUrl == 'string' )
          {
            let elemTpl = (document).getElementById(cm.templateUrl);
            if( elemTpl && elemTpl.getAttribute('type') == SCRIPT_TYPE_NAME )
            {
              cm.template = elemTpl.innerHTML;
              elemTpl.remove();
              cm.templateUrl = undefined
            }
            else
              throw new Error(`template "${cm.templateUrl}" not found among html scripts`)
          }
        })
        return super.resolve(component)
      }
    }
    

    Plunker Link

提交回复
热议问题