Chr*_*ris 7 angular2-directives angular2-template angular
我正在尝试基于click事件将类应用于HTML元素.从父组件的模板设置子组件的选择器的类属性时,这可以正常工作,如下面的父组件片段所示:
[class.bordered]='isSelected(item)'
Run Code Online (Sandbox Code Playgroud)
这将适当地设置单击该项目时的样式.但是,我想基于相同类型的click事件在子组件中设置内部HTML元素的类,这里是子组件样式的所需目标:
template: `
<div class="This is where I really want to apply the style">
{{ item.val }}
</div>
`
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点,很容易支持?或者这被认为是一种不好的做法,我应该设计我的组件以避免这种条件样式的情况?
完整代码:
@Component({
selector: 'parent-component',
directives: [ChildComponent],
template: `
<child-component
*ngFor='#item of items'
[item]='item'
(click)='clicked(item)'
[class.bordered]='isSelected(item)'>
</child-component>
`
})
export class ParentComponent {
items: Item[];
currentItem: item;
constructor(private i: ItemService) {
this.items = i.items;
}
clicked(item: Item): void {
this.currentItem = item;
}
isSelected(item: Items): boolean {
if (!item || !this.currentItem) {
return false;
}
return item.val === this.currentItem.val;
}
}
@Component({
selector: 'child-component',
inputs: ['item'],
template: `
<div class="This is where I really want to apply the style">
{{ item.val }}
</div>
`
})
export class ChildComponent {}
Run Code Online (Sandbox Code Playgroud)
我找到了一种更好的方法来解决这个问题,充分利用 Angular2 的功能。
具体来说,您可以通过更改以下内容将变量传递给子组件,而不是使用 :host 和 CSS 功能进行欺骗:
[class.bordered]='isSelected(item)'
Run Code Online (Sandbox Code Playgroud)
在子类的元素中设置将其更改为
[isBordered]='isSelected(item)'
Run Code Online (Sandbox Code Playgroud)
然后,在您想要在子组件模板中应用边框类的 div 上,只需添加:
[ngClass]='{bordered: isBordered}'
Run Code Online (Sandbox Code Playgroud)
以下是经过更改的完整代码:
@Component({
selector: 'parent-component',
directives: [ChildComponent],
template: `
<child-component
*ngFor='#item of items'
[item]='item'
(click)='clicked(item)'
[isBordered]='isSelected(item)'>
</child-component>
`
})
export class ParentComponent {
items: Item[];
currentItem: item;
constructor(private i: ItemService) {
this.items = i.items;
}
clicked(item: Item): void {
this.currentItem = item;
}
isSelected(item: Items): boolean {
if (!item || !this.currentItem) {
return false;
}
return item.val === this.currentItem.val;
}
}
@Component({
selector: 'child-component',
inputs: ['item'],
template: `
<div [ngClass]='{bordered: isBordered}'>
{{ item.val }}
</div>
`
})
export class ChildComponent {}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
14420 次 |
最近记录: |