Angular 2 - 将条件样式应用于指令的子 HTML 元素
Angular 2 - Apply conditional style to a directive's child HTML element
我正在尝试根据点击事件将 class 应用于 HTML 元素。当从父组件的模板为子组件的选择器设置 class 属性 时,这很好用,如父组件的以下代码片段所示:
[class.bordered]='isSelected(item)'
这将在单击该项目时适当地设置样式。但是,我想根据相同类型的点击事件在子组件中设置一个内部 HTML 元素的 class,这是子组件样式所需的目标:
template: `
<div class="This is where I really want to apply the style">
{{ item.val }}
</div>
`
有没有容易支持的方法来做到这一点?或者这被认为是一种不好的做法,我应该设计我的组件来避免这种有条件的样式情况吗?
完整代码:
@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 {}
添加样式到 child-component
@Component({
selector: 'child-component',
inputs: ['item'],
template: `
<div class="This is where I really want to apply the style">
{{ item.val }}
</div>
`,
styles: [`
:host(.bordered) > div {
// if this selector doesn't work use instead
// child-component.bordered > div {
border: 3px solid red;
}
`],
})
export class ChildComponent {}
我找到了一个更好的方法来解决这个问题,充分利用了 Angular2 的特性。
具体来说,不是使用 :host 和 CSS 功能进行欺骗,而是通过更改将变量传递给子组件:
[class.bordered]='isSelected(item)'
设置在子元素中class改为
[isBordered]='isSelected(item)'
然后在 div 上您想要应用带边框的 class 到子组件的模板中,只需添加:
[ngClass]='{bordered: isBordered}'
这里是完整的代码变化:
@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 {}
像这样的东西对我来说非常有用:
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
styleUrls: [ './app.component.css' ],
template: `
<button
(click)='buttonClick1()'
[disabled] = "btnDisabled"
[ngStyle]="{'color': (btnDisabled)? 'gray': 'black'}">
{{btnText}}
</button>`
})
export class AppComponent {
name = 'Angular';
btnText = 'Click me';
btnDisabled = false;
buttonClick1() {
this.btnDisabled = true;
this.btnText = 'you clicked me';
setTimeout(() => {
this.btnText = 'click me again';
this.btnDisabled = false
}, 5000);
}
}
这是一个工作示例:
https://stackblitz.com/edit/example-conditional-disable-button?file=src%2Fapp%2Fapp.component.html
我正在尝试根据点击事件将 class 应用于 HTML 元素。当从父组件的模板为子组件的选择器设置 class 属性 时,这很好用,如父组件的以下代码片段所示:
[class.bordered]='isSelected(item)'
这将在单击该项目时适当地设置样式。但是,我想根据相同类型的点击事件在子组件中设置一个内部 HTML 元素的 class,这是子组件样式所需的目标:
template: `
<div class="This is where I really want to apply the style">
{{ item.val }}
</div>
`
有没有容易支持的方法来做到这一点?或者这被认为是一种不好的做法,我应该设计我的组件来避免这种有条件的样式情况吗?
完整代码:
@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 {}
添加样式到 child-component
@Component({
selector: 'child-component',
inputs: ['item'],
template: `
<div class="This is where I really want to apply the style">
{{ item.val }}
</div>
`,
styles: [`
:host(.bordered) > div {
// if this selector doesn't work use instead
// child-component.bordered > div {
border: 3px solid red;
}
`],
})
export class ChildComponent {}
我找到了一个更好的方法来解决这个问题,充分利用了 Angular2 的特性。
具体来说,不是使用 :host 和 CSS 功能进行欺骗,而是通过更改将变量传递给子组件:
[class.bordered]='isSelected(item)'
设置在子元素中class改为
[isBordered]='isSelected(item)'
然后在 div 上您想要应用带边框的 class 到子组件的模板中,只需添加:
[ngClass]='{bordered: isBordered}'
这里是完整的代码变化:
@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 {}
像这样的东西对我来说非常有用:
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
styleUrls: [ './app.component.css' ],
template: `
<button
(click)='buttonClick1()'
[disabled] = "btnDisabled"
[ngStyle]="{'color': (btnDisabled)? 'gray': 'black'}">
{{btnText}}
</button>`
})
export class AppComponent {
name = 'Angular';
btnText = 'Click me';
btnDisabled = false;
buttonClick1() {
this.btnDisabled = true;
this.btnText = 'you clicked me';
setTimeout(() => {
this.btnText = 'click me again';
this.btnDisabled = false
}, 5000);
}
}
这是一个工作示例:
https://stackblitz.com/edit/example-conditional-disable-button?file=src%2Fapp%2Fapp.component.html