我正试图基于属性状态禁用/启用组件中的按钮。此状态根据if语句在服务中更改。
false/true

public connectionRetry(
    initialDelay,
    maxRetry,
    errorWhiteList,
    triggerBtn,

  ) {
    return (errors) => errors.scan((retryAttempts, error) => {
        if ( retryAttempts < maxRetry ) {
            triggerBtn = true;
        }
        if ( !errorWhiteList.includes(error.status ) || retryAttempts > maxRetry) {
            triggerBtn = false;
            throw error;
        }
        return retryAttempts + 1;
    }, 0).switchMap((retryAttempts) => {
          let delay = Math.pow(2, retryAttempts - 1) * initialDelay;
          return Observable.timer(delay);
    });
}

*.service.ts
public isBtnDisabled = false;
constructor ( public mainService: MainService, public mainUtils: MainUtils ) {}

public storeData(paramX, paramY) {
     this.mainService.addUser(paramX, paramY)
     .retryWhen(
         this.mainUtils.connectionRetry(
         xxx,
         xxx,
         [xxx],
         this.isBtnDisabled,
    ))
    .subscribe(
       res => {....},
       error = > {...}

    );
}

*.component.ts
*.component.html
问题是我不能让这个概念起作用…属性始终保持组件<button [disabled]="!form.valid || isBtnDisabled">button text</button>isBtnDisabled中的状态:false
如果我在ts中直接实现功能:html,它将直接工作,但不通过服务。与角消化周期有关吗?
我一直在寻找(也在这里的sof)和尝试不同的方法作为,但不幸的是没有成功。实际上似乎很简单。

最佳答案

你也可以通过主题或行为主题
服务:

public $btnSubject = new BehaviorSubject<boolean>();

现在,当您需要将false更改为true,反之亦然时,只要next(//true or false)
return (errors) => errors.scan((retryAttempts, error) => {
   if ( retryAttempts < maxRetry ) {
       this.$btnSubject.next(true)
   }

在组件中订阅该主题:
ngOnInit() {
  this.mainService.$btnSubject.subscribe(val => this.isBtnDisabled = val)
}

通常,P.S.最好将主题保持为类范围的私有,并创建另一个实例-public btnSubject$ = this.$btnSubject.asObservable()并订阅它。
旧帖子:
当您将this.isBtnDisabled传递给retryWhen()时,只传递它的值,而不是对象的引用。
我不确定您想在什么时候将isBtnDisabled设置为true,所以也许有更好的方法,但我认为这也是可以的-您可以简单地引用isBtnDisabled
.subscribe(
  res => {this.triggerBtn = this.mainService.triggerBtn }

09-25 19:37