ngStyle VS 渲染器2?我应该使用什么?
ngStyle VS Renderer2 ? What should I use?
我正在使用 Angular 5.2.9.
我想知道什么时候应该使用 Renderer2 而不是 ngStyle ?哪个是最好的解决方案?
1:<div #div>FOO BAR</div>
@ViewChild('div') div: ElementRef;
constructor(private renderer: Renderer2) {}
ngAfterViewInit() {
this.renderer.setStyle(this.div.nativeElement, 'background', 'blue');
}
2:<div [ngStyle]="styleValue">FOO BAR</div>
styleValue: any = {};
ngAfterViewInit() {
this.styleValue = {background: 'blue'};
}
我知道在 ngFor 中使用 "ngStyle" 更容易,例如:
<div ngFor="let elem of array" [ngStyle]="styleValue">
否则你应该为这种情况做:<div ngFor="let elem of array" #div>FOO BAR</div>
@ViewChildren('div') divs: QueryList<ElementRef>;
constructor(private renderer: Renderer2) {}
ngAfterViewInit() {
this.divs.change.subscribe(() => {
this.toFlipArray.forEach((div) => {
this.renderer.setStyle(this.div.nativeElement, 'background', 'blue');
})
}
}
在 ngFor 中使用 Renderer2 似乎要长得多,我什至没有终止订阅。
性能有区别吗?也许在其他地方?
ngStyle
和 renderer.setStyle
都用于动态设置组件样式
但是 renderer.setStyle
看起来优先于 [ngStyle]
即使 ngStyle
看起来是一种嵌入式样式。
演示示例:
https://stackblitz.com/edit/angular-jtdk4z?file=src%2Fapp%2Fapp.component.html
When looking to the internal implementation of ngStyle
:
https://github.com/angular/angular/blob/master/packages/common/src/directives/ng_style.ts
it looks like it itself is implemented using renderer.setStyle
@Directive({selector: '[ngStyle]'})
export class NgStyle implements DoCheck {
private _ngStyle: {[key: string]: string};
private _differ: KeyValueDiffer<string, string|number>;
constructor(
private _differs: KeyValueDiffers, private _ngEl: ElementRef, private _renderer: Renderer2) {}
@Input()
set ngStyle(v: {[key: string]: string}) {
this._ngStyle = v;
if (!this._differ && v) {
this._differ = this._differs.find(v).create();
}
}
ngDoCheck() {
if (this._differ) {
const changes = this._differ.diff(this._ngStyle);
if (changes) {
this._applyChanges(changes);
}
}
}
private _applyChanges(changes: KeyValueChanges<string, string|number>): void {
changes.forEachRemovedItem((record) => this._setStyle(record.key, null));
changes.forEachAddedItem((record) => this._setStyle(record.key, record.currentValue));
changes.forEachChangedItem((record) => this._setStyle(record.key, record.currentValue));
}
private _setStyle(nameAndUnit: string, value: string|number|null|undefined): void {
const [name, unit] = nameAndUnit.split('.');
value = value != null && unit ? `${value}${unit}` : value;
if (value != null) {
this._renderer.setStyle(this._ngEl.nativeElement, name, value as string);
} else {
this._renderer.removeStyle(this._ngEl.nativeElement, name);
}
}
我正在使用 Angular 5.2.9.
我想知道什么时候应该使用 Renderer2 而不是 ngStyle ?哪个是最好的解决方案?
1:<div #div>FOO BAR</div>
@ViewChild('div') div: ElementRef;
constructor(private renderer: Renderer2) {}
ngAfterViewInit() {
this.renderer.setStyle(this.div.nativeElement, 'background', 'blue');
}
2:<div [ngStyle]="styleValue">FOO BAR</div>
styleValue: any = {};
ngAfterViewInit() {
this.styleValue = {background: 'blue'};
}
我知道在 ngFor 中使用 "ngStyle" 更容易,例如:
<div ngFor="let elem of array" [ngStyle]="styleValue">
否则你应该为这种情况做:<div ngFor="let elem of array" #div>FOO BAR</div>
@ViewChildren('div') divs: QueryList<ElementRef>;
constructor(private renderer: Renderer2) {}
ngAfterViewInit() {
this.divs.change.subscribe(() => {
this.toFlipArray.forEach((div) => {
this.renderer.setStyle(this.div.nativeElement, 'background', 'blue');
})
}
}
在 ngFor 中使用 Renderer2 似乎要长得多,我什至没有终止订阅。
性能有区别吗?也许在其他地方?
ngStyle
和 renderer.setStyle
都用于动态设置组件样式
但是 renderer.setStyle
看起来优先于 [ngStyle]
即使 ngStyle
看起来是一种嵌入式样式。
演示示例:
https://stackblitz.com/edit/angular-jtdk4z?file=src%2Fapp%2Fapp.component.html
When looking to the internal implementation of
ngStyle
:
https://github.com/angular/angular/blob/master/packages/common/src/directives/ng_style.ts
it looks like it itself is implemented using
renderer.setStyle
@Directive({selector: '[ngStyle]'})
export class NgStyle implements DoCheck {
private _ngStyle: {[key: string]: string};
private _differ: KeyValueDiffer<string, string|number>;
constructor(
private _differs: KeyValueDiffers, private _ngEl: ElementRef, private _renderer: Renderer2) {}
@Input()
set ngStyle(v: {[key: string]: string}) {
this._ngStyle = v;
if (!this._differ && v) {
this._differ = this._differs.find(v).create();
}
}
ngDoCheck() {
if (this._differ) {
const changes = this._differ.diff(this._ngStyle);
if (changes) {
this._applyChanges(changes);
}
}
}
private _applyChanges(changes: KeyValueChanges<string, string|number>): void {
changes.forEachRemovedItem((record) => this._setStyle(record.key, null));
changes.forEachAddedItem((record) => this._setStyle(record.key, record.currentValue));
changes.forEachChangedItem((record) => this._setStyle(record.key, record.currentValue));
}
private _setStyle(nameAndUnit: string, value: string|number|null|undefined): void {
const [name, unit] = nameAndUnit.split('.');
value = value != null && unit ? `${value}${unit}` : value;
if (value != null) {
this._renderer.setStyle(this._ngEl.nativeElement, name, value as string);
} else {
this._renderer.removeStyle(this._ngEl.nativeElement, name);
}
}