angular 当将指令附加到IonButton时,不会运行输入信号效果,

qybjjes1  于 6个月前  发布在  Angular
关注(0)|答案(6)|浏览(52)

哪个@angular/*包是bug的来源?

core, elements

描述

预期:
在附加到IonButton的指令中对输入信号运行效果应该触发/运行效果代码。
实际:
效果没有运行。
如果附加到其他html标签上,它可以正常工作。

  1. 打开复现网址。
  2. 按照屏幕上的说明操作。
    洞察:
    当前行为可能来源于这里 => https://github.com/ionic-team/ionic-framework/blob/ba5cebf2542c8fbd6c29af593a31a742e0caba1e/packages/angular/src/directives/proxies.ts#L357

请提供一个链接,指向最小复现bug的情况

https://stackblitz.com/edit/stackblitz-starters-gkckxf?file=src%2Fmain.ts

请提供您发现此bug的环境(运行 ng version )

Angular version: 17.3.4

还有其他问题吗?

问题已由"JB Nizet"和"Matthieu Riegler"确认,并鼓励我在这里创建一个bug报告。

disbfnqx

disbfnqx2#

你好。我们在公司内部的一个新项目中也发现了同样的问题。看起来问题确实是 changeDetectorRef.detach 。这个简单的组件在 effect 中也没有显示,如果你添加了相同的指令:

import { ChangeDetectionStrategy, ChangeDetectorRef, Component } from '@angular/core';

@Component({
  selector: 'app-test-button',
  standalone: true,
  imports: [],
  templateUrl: './test-button.component.html',
  styleUrl: './test-button.component.css',
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class TestButtonComponent {
constructor(changeRef: ChangeDetectorRef) {
  changeRef.detach();
}
}

组件和指令:

@Directive({
  selector: '[test]',
  standalone: true,
})
export class TestDirective {
  test = input.required<string>();
  test2 = computed(() => {
    return this.test() + '2';
  });

  constructor() {
    effect(() => {
      console.log('>> EFFECT', this.test2());
    });
  }
}

.........

<app-test-button [test]="inputText">
    Button with Directive
</app-test-button>
gzszwxb4

gzszwxb43#

根本原因是在指令中注入了 ChangeDetectorRef。当指令应用于组件时,指令中注入的 CDR 是组件的 CDR。
效果被安排在组件初始化时首先运行,并使用 CDR 来实现这一点。在这种情况下,组件永远不会初始化(因为在构造函数中运行了 detach),因此效果永远不会启动。
为了解决这个问题,可以让组件完成其初始化,并仅在 ngAfterViewInit 钩子中分离。这样一来,效果将

4jb9z9bj

4jb9z9bj4#

以下是最小复现:

https://stackblitz.com/edit/stackblitz-starters-7zd1fv?file=src%2Fmain.ts
正如@JeanMeche指出的,这里的根本原因是组件从变更检测树中分离。话虽如此,我确实认识到这非常不明显 - 这是我们在稳定effects API之前要调查的一个案例。

rdlzhqv9

rdlzhqv95#

我已经创建了#55808来捕获根本原因,没有任何外部依赖。让我们在里面继续讨论。
重复的#55808

piok6c0g

piok6c0g6#

重新开放,因为这是一个与#55808不同的问题。

相关问题