2017-04-12 58 views
4

我有以下的子组件,它是继承父组件:角4 - 模板继承

@Component({ 
    template: `<p>child</p>` 
}) 
export class EditChildComponent extends EditViewComponent{ 
    constructor(){ 
    super(); 
    } 
} 



@Component({ 
    template: `<p>parent</p>` 
}) 
export class EditViewComponent{ 
    constructor(){ 
    } 
} 

现在有没有什么办法放置EditViewComponent的模板在ChildComponents模板像你将与NG-做嵌套组件中的内容?我怎么会得到以下结果:

<p>parent</p> 
<p>child</p> 

回答

-1

看看这篇文章: Angular 2, decorators and class inheritance

例子: plnkr.co

import {bootstrap} from 'angular2/platform/browser'; 
import { 
    Component, 
    ElementRef, 
    ComponentMetadata 
} from 'angular2/core'; 
import { isPresent } from 'angular2/src/facade/lang'; 

export function CustomComponent(annotation: any) { 
    return function (target: Function) { 
    var parentTarget = Object.getPrototypeOf(target.prototype).constructor; 
    var parentAnnotations = Reflect.getMetadata('annotations', parentTarget); 

    var parentAnnotation = parentAnnotations[0]; 
    Object.keys(parentAnnotation).forEach(key => { 
     if (isPresent(parentAnnotation[key])) { 
     // verify is annotation typeof function 
     if(typeof annotation[key] === 'function'){ 
      annotation[key] = annotation[key].call(this, parentAnnotation[key]); 
     }else if(
     // force override in annotation base 
     !isPresent(annotation[key]) 
     ){ 
      annotation[key] = parentAnnotation[key]; 
     } 
     } 
    }); 

    var metadata = new ComponentMetadata(annotation); 

    Reflect.defineMetadata('annotations', [ metadata ], target); 
    } 
} 

@Component({ 
    // create seletor base for test override property 
    selector: 'master', 
    template: ` 
    <div>Parent component</div> 
    ` 
}) 
export class AbstractComponent { 

} 

@CustomComponent({ 
    // override property annotation 
    //selector: 'sub', 
    // ANSWER: it's not possible like that but you could have a function here. Something like: 
    template: (template) => { return template + 'add html to temlate in child'} 
    selector: (parentSelector) => { return parentSelector + 'sub'} 
}) 
export class SubComponent extends AbstractComponent { 
    constructor() { 
    //console.log(super); 
    } 
} 

@Component({ 
    selector: 'app', 
    // CHECK: change view for teste components 
    template: ` 
    <div> 
     <div><sub>seletor sub not work</sub></div> 
     <div><master>selector master not work</master></div> 
     <div><mastersub>selector mastersub not work</mastersub></div> 
    </div> 
    `, 
    directives [ SubComponent ] 
}) 
export class App { 

    constructor(private elementRef:ElementRef) { 
    } 

} 

bootstrap(App).catch(err => console.error(err)); 
+3

角4 – Cocowalla

+1

标题状态正如你可以看到'进口{isPresent } from'angular2/src/facade/lang'; '这适用于angular2.0.0-beta.15。我想用@Deprecated标记这个 – Serginho