0

我有一个 Angular Custom 滚动指令,@Input()其中我将 HTML 元素作为参数传递,以将滚动条移动到该特定的 HTML 元素。

使用这种方法,如果我多次传递相同的 HTML 元素,则输入检测仅在第一次发生更改后才检测到任何更改。

有什么方法可以强制 Angular 检测相同输入的变化?

@Input() set elementToScroll(element: HTMLElement) {
    if (element != undefined) {
        console.log(element); // Detecting first time only for same input
        this._osInstance?.scroll(
            { el: element, block: { y: 'begin' } },
            500
        );
    }
}
4

2 回答 2

1

您还可以使用“技巧”,将对象传递给您的输入{element:element}

@Input() set elementToScroll(element:{element:HTMLElement}) {
    //use element.element
    if (element.element != undefined) {
        console.log(element.element); 
        this._osInstance?.scroll(
            { el: element.element, block: { y: 'begin' } },
            500
        );
    }
}

//in your parent you has some like:

@ViewChild('move') myElement:ElementRef
click(){
   this.parameter={element:myElement.nativeElement}
}
于 2021-07-27T06:26:38.287 回答
0

使用接口 OnChanges 扩展您的组件并实现 ngOnChanges 方法:

ngOnChanges(changes: SimpleChanges) {
    if(changes['myProperty']) {
        // myProperty has changed
   }
}

如果您两次设置相同的值,则根据值的类型,此解决方案有效或仅触发一次。

  • 如果 myProperty 的类型是 string, number, ... 那么它只会被触发一次
  • 如果类型很复杂,则解决方案有效。

请参阅以下示例的控制台输出:https ://stackblitz.com/edit/angular-ivy-rd8szx

于 2021-07-27T05:35:29.260 回答