【问题标题】:ngOnChanges() does not trigger button clickngOnChanges() 不会触发按钮点击
【发布时间】:2023-05-03 17:37:01
【问题描述】:

我想触发一个按钮单击事件,该函数位于ngOnChanges() 中。但是,当单击按钮时,函数无法在 ngOnChanges() 内部触发。我错过了什么吗?

这是ts文件中的示例代码:

 import { Component, OnInit, Input, OnChanges } from '@angular/core';
    import { SafeResourceUrl, SafeHtml, DomSanitizer } from '@angular/platform-browser';
    declare var $: any;
    
    @Component({
        selector: 'sl-page',
        template: require('./sl-page.component.html')
    })
    export class PageComponent implements OnInit, OnChanges {
        constructor(
            private sanitizer: DomSanitizer
        ) { }
    
        ngOnInit() {
       
        }
    ngOnChanges() {
       
        $(function () {
            var btn= document.getElementsByClassName("buttonClass");
            var i;

            for (i = 0; i < btn.length; i++) {
                btn[i].addEventListener("click", function () {
                    /* Toggle between adding and removing the "active" class,
            to highlight the button that controls the panel */
                    this.classList.toggle("active");

                    /* Toggle between hiding and showing the active panel */
                    var panel = this.nextElementSibling;
                    if (panel.style.display === "block") {
                        panel.style.display = "none";
                    } else {
                        panel.style.display = "block";
                    }
                });
            }
        });
    }

按钮的 html 代码是:

<div class="buttonBlock" tabindex="0">
    <button class="buttonClass" type="button">{{"Button"}}</button>
    <div class="textClass">this is the text when button is expanded</div>
</div>

【问题讨论】:

  • 你想在 ngOnChanges() 中实现什么,你是否尝试过 ngOnInit() 中的块
  • 尝试在 ngOnChanges 中触发事件可能会导致无限循环,并且看起来像是反模式。同样从您的代码中,您似乎正在激活事件侦听器,而不是触发事件。
  • @GaneshBabu 我也在 ngOnInit() 内部尝试过,但它也没有触发

标签: html jquery angular typescript addeventlistener


【解决方案1】:

尝试像这样更改您的 ngOnChange 方法:

ngOnChanges() {
            var btn= document.getElementsByClassName("buttonClass");

            for (let button of btn) {
                button.addEventListener("click", () => {
                    /* Toggle between adding and removing the "active" class,
            to highlight the button that controls the panel */
                    this.classList.toggle("active");

                    /* Toggle between hiding and showing the active panel */
                    var panel = this.nextElementSibling;
                    //ternaire expression instead of if, just a proposition
                    panel.style.display = panel.style.display === "block" ? "none" ? "block"
                });
            }
    }

【讨论】:

  • 它不起作用:(我尝试使用调试器,当单击按钮时,调试器不会停止在 ngOnChanges 中的代码