标签: angular-renderer2

实现操纵Dom的第三方库的正确方法是什么?

我正在使用第三方库将小部件渲染到屏幕上(Okta的SignInWidget).窗口小部件的呈现方式如下:

this.oktaSignInWidget.renderEl(
    { el: '#widget-container' },
    () => {},
    err => {
      console.error(err);
    }
  );
Run Code Online (Sandbox Code Playgroud)

我最初的想法是把它放到一个指令中,但即使有指令你也应该让Renderer2进行渲染.这里有最好的做法吗?

angular2-directives angular angular-renderer2

8
推荐指数
1
解决办法
163
查看次数

使用@ViewChildren的Angular 5访问div列表

我想获取所有以id'div'开头的div。为此,我使用@ViewChildren但由于我有一个空数组而无法访问div,为什么?

我的范本

<div id="div-1">Div 1</div>
<div id="div-2">Div 2</div>
<input type="button" (click)="getDivs()">
Run Code Online (Sandbox Code Playgroud)

零件

@ViewChildren('div') divs: QueryList<any>;
divList : any[];

getDivs(){ 
   this.divList = this.divs.filter(x => x.id.lastIndexOf('div-', 0) === 0);  
   console.log(this.divList);  
      // this.divList return an empty array but i should have two results  
}
Run Code Online (Sandbox Code Playgroud)

angular angular-renderer2

6
推荐指数
1
解决办法
6116
查看次数

Angular 6:渲染器 2 - 使用 Renderer2 渲染自定义组件不起作用

我有一个自定义角度组件<sample-cmp></sample-cmp>

当它的内容通过 Renderer2 附加到 DOM 中时,它的内容不会在浏览器中呈现。

请找到我用来通过 Renderer2 渲染自定义 Angular 6 组件的以下代码

@ViewChild('formParent') 
public elmRef: ElementRef;  

constructor(public renderer: Renderer2) {

}

const domElm = renderer.createElement('sample-cmp');

renderer.appendChild(elmRef.nativeElement, domElm);
Run Code Online (Sandbox Code Playgroud)

上面的代码将在 UI 中生成以下标签。

<sample-cmp></sample-cmp>
Run Code Online (Sandbox Code Playgroud)

但此“sample-cmp”模板包含“Hello World”文本,但未呈现。

我的问题是,当我们使用渲染器 2 渲染一个自定义组件时,自定义组件模板中的内容不会被渲染。

angular angular-renderer2

6
推荐指数
0
解决办法
5111
查看次数

HTML 中的属性和属性有什么区别?

我为输入元素创建了一个自定义表单控件(使用 ControlValueAccessor),具有以下用于 writeValue 方法的代码。

@ViewChild('inputElement', {static: true}) input;    
writeValue(obj: any): void {
    this.renderer.setAttribute(this.input.nativeElement, 'value', obj);
}
Run Code Online (Sandbox Code Playgroud)

此方法仅更新视图(输入元素)一次,即我初始化表单时。如果我手动修补与上述组件关联的表单控件的值,则表单控件会更新,但视图不会更新

但是,如果我使用setProperty方法而不是setAttribute方法,如下所示,

@ViewChild('inputElement', {static: true}) input; 
writeValue(obj: any): void {
    this.renderer.setProperty(this.input.nativeElement, 'value', obj);
}
Run Code Online (Sandbox Code Playgroud)

视图得到更新

但问题是,文档说value是HTML 中的一个属性,而不是dom 属性

有人能解释一下 HTML 中的属性和属性有什么区别,这在 Angular 的 Renderer2 中产生了这种行为吗?

html dom angular angular-renderer2

6
推荐指数
1
解决办法
2158
查看次数

Renderer.addClass() 上有多个类

如何在 Renderer2.addClass(); 方法上添加多个类

例子:

this.renderer.addClass(this.el.nativeElement, 'btn btn-primary')
Run Code Online (Sandbox Code Playgroud)

当我尝试这样做时,我收到错误:

ERROR DOMException: Failed to execute 'add' on 'DOMTokenList': The token provided ('btn btn-primary') contains HTML space characters, which are not valid in tokens.
    at EmulatedEncapsulationDomRenderer2.addClass
Run Code Online (Sandbox Code Playgroud)

angular2-directives angular angular-renderer2 angular9

6
推荐指数
2
解决办法
7879
查看次数

Renderer2通过selectRootElement选择元素使其内容消失

当尝试使用 Renderer2 创建选项卡组件来选择选项卡元素,并尝试添加一些 css 类来更改颜色(例如当前未选择的选定选项卡)时,HTML 元素从 DOM 中完全消失:

这是选项卡 html 模板:

<div class="detail-nav">
    <div class="nav-item-1">
      <a routerLink="main-config" routerLinkActive="active" (click)=actionItem1()>
        <span>Main config</span>
      </a>
    </div>
    <div class="nav-item-2">
      <a routerLink="sub-config" routerLinkActive="active" (click)=actionItem2()>
        <span>Handling data</span>
      </a>
    </div>
    <div class="nav-item-3">
      <a routerLink="editing" routerLinkActive="active" (click)=actionItem3()>
        <span>Editing</span>
      </a>
    </div>
<div>
Run Code Online (Sandbox Code Playgroud)

我添加了一些 css 以使锚标记与父 div 具有相同的高度,

所以当使用 Renderer2 时:


...

constructor(private route: ActivatedRoute, private renderer: Renderer2) {}

...

let elm = this.renderer.selectRootElement(".nav-item a");

this.renderer.addClass(elm, 'nav-item');
Run Code Online (Sandbox Code Playgroud)

CSS:

.nav-item {
  background-color: LightBlue;
}
Run Code Online (Sandbox Code Playgroud)

然后执行时 achor 标签会从 DOM 中完全消失:

.nav-item { …
Run Code Online (Sandbox Code Playgroud)

css angular angular-renderer2

3
推荐指数
1
解决办法
5366
查看次数

带有渲染器的 Angular 2+ CSS 自定义属性(变量)

我正在尝试将 Vanilla JavaScript 代码转换为 Angular 2+。

在 Javascript 中,我有这样的声明:

document.documentElement.style.setProperty(`--${cssVariableName}`, value);
Run Code Online (Sandbox Code Playgroud)

在 Angular 中,我发现复制上述语句的唯一方法是这样的:

renderer.setProperty(document.documentElement, 'style', `--${cssVariableName}: ${value}`);
Run Code Online (Sandbox Code Playgroud)

问题:如果我在不同时间动态设置多个自定义属性(--cssVariable1、--cssVariable2...)。Angular Renderer 将覆盖 style 属性而不是附加到 style 属性。

渲染器可以用来实现这个功能吗?如果没有,是否有在 Angular 中使用 CSS 自定义属性的首选方法?谢谢!

javascript css angular angular-renderer angular-renderer2

2
推荐指数
1
解决办法
1627
查看次数

如何在 Angular 中为原生元素添加多种样式

我正在尝试以角度向本机元素添加多种样式,目前正在使用renderer2API。

我有一个要求,其中样式会动态更改,并且可以有多种样式。这就是为什么我不使用类 (addClass/removeClass)。

构造函数(私有 elRef:ElementRef,私有渲染器:Renderer2)

this.renderer.setStyle(this.elRef.nativeElement, "text-align", "center"); …………

需要一种动态添加样式的方法。就像是: this.renderer.setStyle(this.elRef.nativeElement, {style1: value1, style2: value2});

javascript angular angular-renderer2

1
推荐指数
1
解决办法
7787
查看次数