gpt4 book ai didi

javascript - 如何从 Material Angular 应用样式

转载 作者:行者123 更新时间:2023-11-30 14:47:45 26 4
gpt4 key购买 nike

我需要添加一个具有 Material Angular 2 样式的按钮。所以我有一个按钮可以执行此操作:

<button mat-button (click)="addElement($event, 'button')">Add button</button>

定义addElement的地方:

addElement(ev, tag) {
const htmlElem = ev.currentTarget;
const el = this.renderer.createElement(tag);
this.renderer.setAttribute(el, 'mat-button', '');
el.textContent = 'New Button';

htmlElem.parentNode.insertBefore(el, null);
}

点击按钮然后在我的 HTML 中创建一个新元素,如下所示:

<button mat-button">Add button</button>

函数代码正确生成了按钮,但它并未应用所有子项,如 material code 中的原始按钮代码所示。

那么我是否有办法“刷新”按钮,以便标准 Mat 按钮中的所有内容都适用于通过 JS 代码添加的按钮?

最佳答案

出了什么问题?

你是对的,你已经添加了 mat-button 属性,但是由于你是动态创建一个按钮,你无法实现生成 mat-button 的整个结构。

下面是mat-button的整体样式和结构

<button class="mat-button" mat-button="">
<span class="mat-button-wrapper">Add button</span>
<div class="mat-button-ripple mat-ripple"></div>
<div class="mat-button-focus-overlay"></div>
</button>

如您所见,mat-button 中还有其他 html 元素,其中包括涟漪效果和焦点叠加。


问题的解决方案

我们将使用 Angular Renderer 创建 html 元素,将属性设置为元素并将其附加到元素上。

那么我们做了什么

创建将触发追加的按钮

<button id="clickBtn" (click)="onClick()">Click here to add Button</button>

在组件中导入 import Directive, ElementRef, Renderer2

{ Component, Directive, ElementRef, Renderer2 } from '@angular/core';

添加一个指令,该指令将针对将附加按钮的 html 元素(#clickBtn [是我们创建的按钮的 id 标记)

@Directive({ 
selector: '#clickBtn'
})

创建一个构造函数来注入(inject)渲染器和元素引用

constructor(private renderer: Renderer2,private elRef: ElementRef)   { 

}

触发点击事件追加按钮

    onClick() {
const btn = this.renderer.createElement('button');
const span = this.renderer.createElement('span');
const div1 = this.renderer.createElement('div');
const div2 = this.renderer.createElement('div');

const text = this.renderer.createText('I am a Generated Button');

const attrBtn = this.renderer.setAttribute(btn, 'class', 'mat-button');
const attrSpan = this.renderer.setAttribute(span, 'class', 'mat-button-wrapper');
const attrDiv1 = this.renderer.setAttribute(div1, 'class', 'mat-button-ripple mat-ripple');
const attrDiv2 = this.renderer.setAttribute(div2, 'class', 'mat-button-focus-overlay');

this.renderer.appendChild(span, text);
this.renderer.appendChild(btn, span);
this.renderer.appendChild(btn, div1);
this.renderer.appendChild(btn, div2);
this.renderer.appendChild(this.elRef.nativeElement, btn);
}

哇哦,这是怎么回事。如您所见,我们在这里生成了 mat-button 的所有结构

要了解有关 Renderer2 的更多信息,请访问此链接。

https://alligator.io/angular/using-renderer2/


请查看 stackblitz 上的实时代码链接

https://stackblitz.com/edit/dmgrave-ng-so-answer-dom?file=app%2Fapp.component.ts

希望这对您有所帮助。

关于javascript - 如何从 Material Angular 应用样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48632865/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com