第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

innerHTML - 在(點(diǎn)擊)事件中傳遞值

innerHTML - 在(點(diǎn)擊)事件中傳遞值

鴻蒙傳說(shuō) 2023-07-06 16:59:25
如何向innerHTML中已設(shè)置的點(diǎn)擊事件傳入?yún)?shù)?成分html = "Lorem ipsum dolor sit amet, <mark (click)='hello('my name is what')'>consectetur adipiscing elit</mark>"constructor(private changeDetectorRef: ChangeDetectorRef) {}ngAfterContentChecked() {  this.changeDetectorRef.detectChanges();   if (this.showcaseContentText.nativeElement.querySelector('mark')) {     this.showcaseContentText.nativeElement      .querySelector('mark')      .addEventListener('click', this.hello.bind(this));   }}hello(test: string) {  console.log(test);}模板<div class="text-md-left text-muted mb-lg-6" [innerHTML]="html" style="font-size: 15px"></div>
查看完整描述

1 回答

?
慕的地10843

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超8個(gè)贊

我可以使用 RxJS而不是hook來(lái)捕獲標(biāo)簽click中的事件。我還使用 Angular 清理了 HTML 。markfromEventaddEventListenerAfterViewInitAfterContentCheckedDomSanitizer


嘗試以下操作


應(yīng)用程序組件.ts


import { fromEvent, Subject } from "rxjs";

import { takeUntil } from "rxjs/operators";


...

export class AppComponent implements AfterViewInit, OnDestroy {

? @ViewChild("showcaseContentText") showcaseContentText: ElementRef<any>;

? html =

? ? "Lorem ipsum dolor sit amet, <mark (click)='hello('my name is what')'>consectetur adipiscing elit</mark>";

? closed$ = new Subject<any>();


? constructor(private cdr: ChangeDetectorRef) {}


? ngAfterViewInit() {

? ? this.cdr.detectChanges();

? ? fromEvent(

? ? ? this.showcaseContentText.nativeElement.querySelector("mark"),

? ? ? "click"

? ? )

? ? ? .pipe(takeUntil(this.closed$))

? ? ? .subscribe(e => console.log(e));

? }


? ngOnDestroy() {

? ? this.closed$.next();

? }

}

應(yīng)用程序組件.html


<div #showcaseContentText class="text-md-left text-muted mb-lg-6" [innerHTML]="html | safe" style="font-size: 15px">

</div>

安全管道.ts


import { Pipe, PipeTransform } from "@angular/core";

import { DomSanitizer, SafeHtml } from "@angular/platform-browser";


@Pipe({

? name: "safe",

? pure: true

})

export class SafePipe implements PipeTransform {

? constructor(protected sanitizer: DomSanitizer) {}


? public transform(value: any): SafeHtml {

? ? return this.sanitizer.bypassSecurityTrustHtml(value);

? }

}

更新:<mark>單個(gè)標(biāo)簽中有多個(gè)標(biāo)簽innerHTML

在這種情況下,您可以使用querySelectorAll()該函數(shù)來(lái)代替querySelector()。此外,由于會(huì)有多個(gè)元素,您可以使用Array#mapwithfromEvent和 RxJSmap運(yùn)算符來(lái)獲取各自的ids。

請(qǐng)注意,我們創(chuàng)建了多個(gè)訂閱流。因此標(biāo)簽的數(shù)量越多mark,流的數(shù)量就越多。當(dāng)組件關(guān)閉時(shí)(例如takeUntil使用),您需要關(guān)閉它。有更好的方法來(lái)處理多個(gè)訂閱(例如使用combineLatest),但它們都有自己的優(yōu)點(diǎn)和缺點(diǎn)。我將把它們留給你來(lái)解決。

控制器

export class AppComponent implements AfterViewInit, OnDestroy {

? @ViewChild("showcaseContentText") showcaseContentText: ElementRef<any>;

? html =

? ? "Lorem ipsum dolor sit amet, <mark id='mark1' (click)='hello('my name is what')'>consectetur adipiscing elit</mark>. Lorem ipsum <mark id='mark2' (click)='hello('my name is two')'>dolor sit amet</mark>, consectetur adipiscing elit";

? closed$ = new Subject<any>();


? constructor(private cdr: ChangeDetectorRef) {}


? ngAfterViewInit() {

? ? this.cdr.detectChanges();

? ? const obs$ = Array.from(

? ? ? this.showcaseContentText.nativeElement.querySelectorAll("mark")

? ? ).map((el: HTMLElement) => fromEvent(el, "click").pipe(map(_ => el["id"])));


? ? obs$.forEach(obs =>

? ? ? obs.pipe(takeUntil(this.closed$)).subscribe({

? ? ? ? next: id => {

? ? ? ? ? console.log(id);

? ? ? ? }

? ? ? })

? ? );

? }


? ngOnDestroy() {

? ? this.closed$.next();

? }

}


查看完整回答
反對(duì) 回復(fù) 2023-07-06
  • 1 回答
  • 0 關(guān)注
  • 250 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)