Angular2:用组件的模板替换宿主元素
Angular2: replace host element with component's template
我是 angular
的新手,特别是 angular2
。我正在尝试编写一个容器组件,其中应该有子组件。
例如容器组件:
@Component({
selector: 'my-list',
template: `
<ul>
<ng-content></ng-content>
</ul>
`
})
export class MyList {
}
子组件:
import { Component } from 'angular2/core'
@Component({
selector: 'my-item',
template: `
<li>
<ng-content></ng-content>
</li>
`
})
export class MyItem {
}
我想做这个结构:
<my-list>
<my-item>One</my-item>
<my-item>Two</my-item>
</my-list>
要呈现给以下一个:
<my-list>
<ul>
<li>One</li>
<li>Two</li>
</ul>
</my-list>
但相反,我拥有容器的宿主元素以及保留的项目:
<my-list>
<ul>
<my-item>
<li>One</li>
</my-item>
<my-item>
<li>Two</li>
</my-item>
</ul>
</my-list>
问题:有没有办法去掉宿主元素,只留下渲染的模板?
这你应该得到你想要的:
@Component({
selector: 'ul[my-list]',
template: `
<ng-content></ng-content>
`
})
export class MyList {
}
@Component({
selector: 'li[my-item]',
template: `
<ng-content></ng-content>
`
})
export class MyItem {
...
}
<ul my-list>
<li my-item>One</li my-item>
<li my-item>Two</li my-item>
</ul my-list>
最后我找到了解决方案:将 ElementRef
注入 MyItem
并使用它的 nativeElement.innerHTML
:
我的列表:
import { Component, ContentChildren, QueryList } from 'angular2/core'
import { MyItem } from './myitem'
@Component({
selector: 'my-list',
template: `
<ul>
<li *ngFor="#item of items" [innerHTML]="item.innerHTML"></li>
</ul>
`
})
export class MyList {
@ContentChildren(MyItem) items: QueryList<MyItem>
}
我的项目:
import { Directive, Inject, ElementRef } from 'angular2/core'
@Directive({selector: 'my-item'})
export class MyItem {
constructor(@Inject(ElementRef) element: ElementRef) {
this.innerHTML = element.nativeElement.innerHTML
}
}
新 angular 版本有非常酷的指令,也可以用于您的用例。 Tadaa:NgComponentOutlet。编码愉快 ;)
示例:
@Component({selector: 'hello-world', template: 'Hello World!'})
class HelloWorld {
}
@Component({
selector: 'ng-component-outlet-simple-example',
template: `<ng-container *ngComponentOutlet="HelloWorld"></ng-container>`
})
class NgTemplateOutletSimpleExample {
// This field is necessary to expose HelloWorld to the template.
HelloWorld = HelloWorld;
}
在最新的angular中你甚至可以避免添加<ng-content></ng-content>
我申请的是这样的:
import {Component} from '@angular/core';
@Component({
selector: 'div[app-root]',
templateUrl: 'app.component.html',
styleUrls: ['app.component.css']
})
export class AppComponent {
title = 'Delegates Presence Reporting';
}
和模板:
<div class="centered">
<h1>{{title}}</h1>
</div>
index.html
<body>
<div app-root></div>
</body>
我是 angular
的新手,特别是 angular2
。我正在尝试编写一个容器组件,其中应该有子组件。
例如容器组件:
@Component({
selector: 'my-list',
template: `
<ul>
<ng-content></ng-content>
</ul>
`
})
export class MyList {
}
子组件:
import { Component } from 'angular2/core'
@Component({
selector: 'my-item',
template: `
<li>
<ng-content></ng-content>
</li>
`
})
export class MyItem {
}
我想做这个结构:
<my-list>
<my-item>One</my-item>
<my-item>Two</my-item>
</my-list>
要呈现给以下一个:
<my-list>
<ul>
<li>One</li>
<li>Two</li>
</ul>
</my-list>
但相反,我拥有容器的宿主元素以及保留的项目:
<my-list>
<ul>
<my-item>
<li>One</li>
</my-item>
<my-item>
<li>Two</li>
</my-item>
</ul>
</my-list>
问题:有没有办法去掉宿主元素,只留下渲染的模板?
这你应该得到你想要的:
@Component({
selector: 'ul[my-list]',
template: `
<ng-content></ng-content>
`
})
export class MyList {
}
@Component({
selector: 'li[my-item]',
template: `
<ng-content></ng-content>
`
})
export class MyItem {
...
}
<ul my-list>
<li my-item>One</li my-item>
<li my-item>Two</li my-item>
</ul my-list>
最后我找到了解决方案:将 ElementRef
注入 MyItem
并使用它的 nativeElement.innerHTML
:
我的列表:
import { Component, ContentChildren, QueryList } from 'angular2/core'
import { MyItem } from './myitem'
@Component({
selector: 'my-list',
template: `
<ul>
<li *ngFor="#item of items" [innerHTML]="item.innerHTML"></li>
</ul>
`
})
export class MyList {
@ContentChildren(MyItem) items: QueryList<MyItem>
}
我的项目:
import { Directive, Inject, ElementRef } from 'angular2/core'
@Directive({selector: 'my-item'})
export class MyItem {
constructor(@Inject(ElementRef) element: ElementRef) {
this.innerHTML = element.nativeElement.innerHTML
}
}
新 angular 版本有非常酷的指令,也可以用于您的用例。 Tadaa:NgComponentOutlet。编码愉快 ;)
示例:
@Component({selector: 'hello-world', template: 'Hello World!'})
class HelloWorld {
}
@Component({
selector: 'ng-component-outlet-simple-example',
template: `<ng-container *ngComponentOutlet="HelloWorld"></ng-container>`
})
class NgTemplateOutletSimpleExample {
// This field is necessary to expose HelloWorld to the template.
HelloWorld = HelloWorld;
}
在最新的angular中你甚至可以避免添加<ng-content></ng-content>
我申请的是这样的:
import {Component} from '@angular/core';
@Component({
selector: 'div[app-root]',
templateUrl: 'app.component.html',
styleUrls: ['app.component.css']
})
export class AppComponent {
title = 'Delegates Presence Reporting';
}
和模板:
<div class="centered">
<h1>{{title}}</h1>
</div>
index.html
<body>
<div app-root></div>
</body>