Angular组件标签绑定方式
Angular component tag bind method
我正在尝试在父组件的 html 中设置组件的宽度和高度及其初始声明。具有以下组件标记(在父项的 html 中):
<app-ipe-artboard [artboard]="artboard" [ngStyle]="setStyle()"></app-ipe-artboard>
其中 setStyle()
是画板组件(本身)上的方法:
@Component({
selector: 'app-ipe-artboard'
})
export class ArtboardComponent implements OnInit {
@Input() public artboard: Artboard;
ngOnInit() {
}
setStyle(): object {
return {
width: this.artboard.width + 'px',
height: this.artboard.height + 'px'
};
}
}
是否有可能达到这个方法(不是我现在所说的那样,因为它会连续给出编译时错误和不需要的运行时行为)?或者组件在这个地方渲染时还没有实例化,是否需要以某种不同的方式完成?
问题是现在父组件正在寻找它自己的 setStyle
方法但没有找到任何方法,因此它会引发运行时错误。 app-ipe-artboard
上的方法仅限于该组件,父组件无法访问(除非您将对该组件的引用传递给您的父组件,这对清理它没有多大作用)。
解决方案 1
假设您正在寻找的行为是根据 artboard
上的变量设置子组件的宽度和高度,您可以使用 @HostBinding
完成此操作。
@Component({
selector: 'app-ipe-artboard'
})
export class ArtboardComponent implements OnInit {
@Input() public artboard: Artboard;
@HostBinding('style.width') artboardWidth;
@HostBinding('style.height') artboardHeight;
ngOnInit() {
this.artboardWidth = artboard.width;
this.artboardHeight = artboard.height;
}
}
解决方案 2
另一种方法可以做到这一点,因为您在父组件中有 artboard
,只需将 setStyle
方法移动到父组件。
父组件
@Component({
template: `<app-ipe-artboard [artboard]="artboard" [ngStyle]="setStyle()"></app-ipe-artboard>`
})
export class ParentComponent {
artboard: Artboard = {width: 500, height: 300};
setStyle() {
return { width: this.artboard.width + 'px', height: this.artboard.height + 'px' }
}
}
解决方案 3
来自 Gunter 的回答 .
You need to pass the same value you would add to an element like and sanitize the styles.
示例代码由Gunter提供:
@HostBinding('style')
get myStyle(): String {
return this.sanitizer.bypassSecurityTrustStyle('background: red; display: block;');
}
constructor(private sanitizer:DomSanitizer) {}
我正在尝试在父组件的 html 中设置组件的宽度和高度及其初始声明。具有以下组件标记(在父项的 html 中):
<app-ipe-artboard [artboard]="artboard" [ngStyle]="setStyle()"></app-ipe-artboard>
其中 setStyle()
是画板组件(本身)上的方法:
@Component({
selector: 'app-ipe-artboard'
})
export class ArtboardComponent implements OnInit {
@Input() public artboard: Artboard;
ngOnInit() {
}
setStyle(): object {
return {
width: this.artboard.width + 'px',
height: this.artboard.height + 'px'
};
}
}
是否有可能达到这个方法(不是我现在所说的那样,因为它会连续给出编译时错误和不需要的运行时行为)?或者组件在这个地方渲染时还没有实例化,是否需要以某种不同的方式完成?
问题是现在父组件正在寻找它自己的 setStyle
方法但没有找到任何方法,因此它会引发运行时错误。 app-ipe-artboard
上的方法仅限于该组件,父组件无法访问(除非您将对该组件的引用传递给您的父组件,这对清理它没有多大作用)。
解决方案 1
假设您正在寻找的行为是根据 artboard
上的变量设置子组件的宽度和高度,您可以使用 @HostBinding
完成此操作。
@Component({
selector: 'app-ipe-artboard'
})
export class ArtboardComponent implements OnInit {
@Input() public artboard: Artboard;
@HostBinding('style.width') artboardWidth;
@HostBinding('style.height') artboardHeight;
ngOnInit() {
this.artboardWidth = artboard.width;
this.artboardHeight = artboard.height;
}
}
解决方案 2
另一种方法可以做到这一点,因为您在父组件中有 artboard
,只需将 setStyle
方法移动到父组件。
父组件
@Component({
template: `<app-ipe-artboard [artboard]="artboard" [ngStyle]="setStyle()"></app-ipe-artboard>`
})
export class ParentComponent {
artboard: Artboard = {width: 500, height: 300};
setStyle() {
return { width: this.artboard.width + 'px', height: this.artboard.height + 'px' }
}
}
解决方案 3
来自 Gunter 的回答
You need to pass the same value you would add to an element like and sanitize the styles.
示例代码由Gunter提供:
@HostBinding('style')
get myStyle(): String {
return this.sanitizer.bypassSecurityTrustStyle('background: red; display: block;');
}
constructor(private sanitizer:DomSanitizer) {}