当条件更改(变为true)时,我想只运行一次操作,例如

areAllDetailsLoaded() => run a function

我想将其编码为Signal,就像

areAllDetailsLoaded=signal(false);

并将其用作

effect( () =>  {
   if (areAllDetailsLoaded()) {
          storage().getDetails() ....... run code

我面临的问题是,显然Signal storage也被考虑在内,并且每当storage()更改时,代码就会运行.这不是我想要的.areAllDetailsLoaded更改为true后,代码应只运行一次.

老实说,我已经没有 idea 了.或者也许我对Angular 信号的理解还不够好.因此,锅炉模板模式将受到欢迎--适合Signals.

推荐答案

我发现了一些非常好的观察结果.

  1. 只有顶层的信号读取才会触发该效果,不确定是否是设计的.

  2. 该效果返回一个引用,并具有 destruct 属性来 destruct 该效果并确保信号只运行一次!

完整代码:完整代码:

import { Component, effect, signal } from '@angular/core';
import { bootstrapApplication } from '@angular/platform-browser';
import 'zone.js';

@Component({
  selector: 'app-root',
  standalone: true,
  template: `
    <button (click)="areAllDetailsLoaded.set(true)">areAllDetailsLoaded set true</button>
  `,
})
export class App {
  areAllDetailsLoaded = signal(false);
  storage = signal(false);
  name = 'Angular';

  constructor() {
    const effectRef = effect(() => {
      console.log('effect runs');
      // const storage1 = this.storage(); // un comment this to see the effect running for each change of storage
      if (this.areAllDetailsLoaded()) {
        const storage = this.storage();
        console.log('code runs');
        effectRef?.destroy();
      }
    });
  }

  ngOnInit() {
    setInterval(() => {
      this.storage.set(!this.storage());
      console.log('interval', this.storage());
    }, 1000);
  }
}

bootstrapApplication(App);

Stackblitz Demo

Angular相关问答推荐

布局之间的Angular 变化检测需要重新加载

如何在Angular中执行一个操作条件为多个可观测值?

[已解决]如何在模块ngDoBootstrap中测试Angular 自定义元素和做覆盖

如何包装NGB carousel ?

如何使用带有17角的Swiper 11.0.5元素

天使17中的倒计时器

将ngModel绑定到@Input属性是不是一种糟糕的做法?

当信号的值发生变化时,模板不会更新

无法在 Angular 中使用 CryptoJS 正确加密

如何有条件地更新 Angular 路由解析器数据?

如何从 RxJS 重试中排除某些 url

Angular 从 13.3.8 恢复到 13.3.7

为什么 HttpParams 在 Angular 4.3 中的多行中不起作用

如何在 Angular 2 中使用 protractor ?

如何使用ngrx和effects 订阅成功回调

Angular 2在单击子项时防止单击父项

如何使用 Bootstrap 4 flexbox 填充可用内容?

使用 Angular 2 新路由更改页面标题

在 Angular 2 中打印 Html 模板

如何每隔一段时间发出 HTTP 请求?