【问题标题】:Get ObservableInput value and avoid subscription to it获取 ObservableInput 值并避免订阅它
【发布时间】:2021-07-13 18:21:52
【问题描述】:

我的 Angular 组件中有一个 ObservableInput,还有一个主题按钮,按下该按钮后,我获取输入值,并调用另一个 observable,然后订阅它以使用返回的数据。

但问题是,每当此输入发生变化时,它都会触发 (onClick) 函数,该函数不会在不点击的情况下触发,因为它会自动订阅输入,因为我使用的是 switchMap。

我怎样才能防止这种情况发生?

class SomeComponent {
   @ObservableInput @Input() name$: Observable<string>;
   private clickSubject = new Subject<Event>();

   constructor(private _someService: Service) {
      this.clickSubject.pipe(
          switchMap(() => this.name$),
          switchMap((name) => this._someService.getUserByName(name))
      ).subscribe((data: UserData) => {
          // Work around with data here.
      });
   }

   onUserClick(): void {
       clickSubject.next();
   }
}

我读到我可以使用 RxJS 中的“merge()”,但我似乎找不到让它工作的方法。 mergeMap 也返回一个 Observable 但订阅了不需要的 name$。

我只需要获取当前的 name$ 值而不订阅它,因此无论何时更改,它都不会触发订阅块上的任何内容。

谢谢。

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    我认为这里不需要将name$ 设置为@ObservableInput。如果它仅用于 HTTP 请求的 a 参数,它可能只是一个普通的 Angular @Input 属性。然后可以使用this.nameswitchMap 中访问它。

    class SomeComponent implements OnInit {
       Input() name: string;
       private clickSubject = new Subject<Event>();
    
       ngOnInit(private _someService: Service) {
         this.clickSubject.pipe(
           switchMap(() => this._someService.getUserByName(this.name))
         ).subscribe((data: UserData) => {
           // Work around with data here.
         });
       }
    
       onUserClick(): void {
         clickSubject.next();
       }
    }
    

    【讨论】:

    • 事情是我需要这个属性是一个可观察的,因为它动态变化并在组件没有被破坏时监听这个变化。有点像使用 ngOnChange。由于我唯一的订阅是点击,出于某种原因,即使正常的输入改变了它的值,它也不会被分配给this.name
    • 我不明白。那么您是说即使使用 [name]="someVar" 绑定在父级中设置了新值,子级中的变量 this.name 仍包含旧值?
    • 是的,即使我将它作为[name]="someVar" 传递,它也不会在组件内更新。我读过建议订阅输入。有些人在输入时使用 BehaviorSubject。
    猜你喜欢
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 2020-08-18
    • 2020-05-31
    • 1970-01-01
    • 2022-08-25
    • 2021-06-14
    相关资源
    最近更新 更多