要么我使用 Angular Renerer2 错误,要么它坏了。任何人都可以解决这个问题吗?
Either i am using Angular Renerer2 wrong, or it is broken. Can anyone figure this out?
使用普通的旧javascript,就是这么简单:
myElement.style.setProperty('property', 'value', 'important');
在 Angular 中,没那么多。
我已经在所有地方进行了详尽的搜索,但找不到一个关于如何执行此操作的示例,所以我在这里问这个问题。
要么 Angular 中的 Renderer2 坏了,要么我只是做错了。
我将以下内容导入到我的组件中:
import {ElementRef, Renderer2, RendererStyleFlags2 } from '@angular/core';
并且,在我的构造函数中:
constructor(private elRef: ElementRef,
private renderer: Renderer2);
我在我的模板中的一个元素上设置了一个没有问题的样式:
this.renderer.setStyle(this.elRef.nativeElement.querySelector('.my-div'), 'color', '#fff');
当我尝试像这样设置重要标志时:
this.renderer.setStyle(this.elRef.nativeElement.querySelector('.my-div'), 'color', '#fff', RendererStyleFlags2.Important);
或者像这样:
this.renderer.setStyle(this.elRef.nativeElement.querySelector('.my-div'), 'color', '#fff', flags:RendererStyleFlags2.Important);
或者像这样:
public myFlags:RendererStyleFlags2;
this.renderer.setStyle(this.elRef.nativeElement.querySelector('.my-div'), 'color', '#fff', myFlags.Important);
或者像这样的另一种方式:
public myFlags:RendererStyleFlags2.Important;
public myFlags:RendererStyleFlags2.Important = 1;
以及许多其他使用数组和对象的尝试:
myFlags:any = {important: 1}
None以上作品
这是 angular 核心中存在的方法:
setStyle(el: any, style: string, value: any, flags: RendererStyleFlags2): void {
if (flags & RendererStyleFlags2.DashCase) {
el.style.setProperty(
style, value, !!(flags & RendererStyleFlags2.Important) ? 'important' : '');
} else {
el.style[style] = value;
}
}
谁能告诉我我做错了什么?
感觉您要么需要同时使用两个渲染器标志,要么将 !important
添加到字符串值。
const flags = RendererStyleFlags2.DashCase | RendererStyleFlags2.Important;
this.renderer.setStyle(this.elRef.nativeElement.querySelector('.my-div'), 'color', '#fff', flags);
或者
this.renderer.setStyle(this.elRef.nativeElement.querySelector('.my-div'), 'color', '#fff!important');
另一种解决方案是用 renderer
覆盖 style
属性,例如:
this.renderer.setAttribute(myElementHere, 'style', 'color: #FFF !important');
但是警告,它将删除/覆盖已经存在的内联样式。对于这种情况,您可以读取当前 style
属性的值并将其附加/添加到将被覆盖的值。
请注意,这个解决方案有点,我想说,hacky,但如果你能处理它,你就可以开始了。
我没有进行性能测试或类似的测试(setStyle
vs setAttribute
)。
这只是为了完成覆盖内联样式的可能性。
使用普通的旧javascript,就是这么简单:
myElement.style.setProperty('property', 'value', 'important');
在 Angular 中,没那么多。 我已经在所有地方进行了详尽的搜索,但找不到一个关于如何执行此操作的示例,所以我在这里问这个问题。
要么 Angular 中的 Renderer2 坏了,要么我只是做错了。
我将以下内容导入到我的组件中:
import {ElementRef, Renderer2, RendererStyleFlags2 } from '@angular/core';
并且,在我的构造函数中:
constructor(private elRef: ElementRef,
private renderer: Renderer2);
我在我的模板中的一个元素上设置了一个没有问题的样式:
this.renderer.setStyle(this.elRef.nativeElement.querySelector('.my-div'), 'color', '#fff');
当我尝试像这样设置重要标志时:
this.renderer.setStyle(this.elRef.nativeElement.querySelector('.my-div'), 'color', '#fff', RendererStyleFlags2.Important);
或者像这样:
this.renderer.setStyle(this.elRef.nativeElement.querySelector('.my-div'), 'color', '#fff', flags:RendererStyleFlags2.Important);
或者像这样:
public myFlags:RendererStyleFlags2;
this.renderer.setStyle(this.elRef.nativeElement.querySelector('.my-div'), 'color', '#fff', myFlags.Important);
或者像这样的另一种方式:
public myFlags:RendererStyleFlags2.Important;
public myFlags:RendererStyleFlags2.Important = 1;
以及许多其他使用数组和对象的尝试:
myFlags:any = {important: 1}
None以上作品
这是 angular 核心中存在的方法:
setStyle(el: any, style: string, value: any, flags: RendererStyleFlags2): void {
if (flags & RendererStyleFlags2.DashCase) {
el.style.setProperty(
style, value, !!(flags & RendererStyleFlags2.Important) ? 'important' : '');
} else {
el.style[style] = value;
}
}
谁能告诉我我做错了什么?
感觉您要么需要同时使用两个渲染器标志,要么将 !important
添加到字符串值。
const flags = RendererStyleFlags2.DashCase | RendererStyleFlags2.Important;
this.renderer.setStyle(this.elRef.nativeElement.querySelector('.my-div'), 'color', '#fff', flags);
或者
this.renderer.setStyle(this.elRef.nativeElement.querySelector('.my-div'), 'color', '#fff!important');
另一种解决方案是用 renderer
覆盖 style
属性,例如:
this.renderer.setAttribute(myElementHere, 'style', 'color: #FFF !important');
但是警告,它将删除/覆盖已经存在的内联样式。对于这种情况,您可以读取当前 style
属性的值并将其附加/添加到将被覆盖的值。
请注意,这个解决方案有点,我想说,hacky,但如果你能处理它,你就可以开始了。
我没有进行性能测试或类似的测试(setStyle
vs setAttribute
)。
这只是为了完成覆盖内联样式的可能性。