【问题标题】:RxJs BehaviorSubject's next() method in serviceRxJs BehaviorSubject 的 next() 方法在服务中
【发布时间】:2019-12-15 12:31:43
【问题描述】:

我使用以下方法在添加新记录后刷新Details 页面。我也需要在更新记录后刷新。

EventProxyService

export class EventProxyService {
    private eventTracker = new BehaviorSubject<any>();

    getEvent(): Observable<any> {
        return this.eventTracker.asObservable();
    }

    setEvent(param: any): void {
        this.eventTracker.next(param);
    }
}

创建组件:

export class CreateComponent implements OnInit {

    constructor(private eventProxyService: EventProxyService) { }

    create(param: any): void {
        //other staff related to creating record

        this.eventProxyService.setEvent(param);
    }
}

DetailsComponent:

export class DetailsComponent implements OnInit {

    subscription;

    constructor(private eventProxyService: EventProxyService) { }

    ngOnInit() {
        this.subscription = this.eventProxyService.getEvent().subscribe((param: any) => {
            this.refresh(param);
        );
    }

    refresh(param) {
        this.record = param; //update record via new one passed from service
    }

    ngOnDestroy(): void {
        this.subscription.unsubscribe();
    }
}

这种方法效果很好,但我对以下问题有点困惑:

1) 因为我也在update() 方法中调用this.eventProxyService.setEvent(param);,就像在create() 方法中一样,在我的服务级别而不是组件级别调用它会不会是个好主意? p>

2)上面CreateComponent中触发next()方法有什么问题吗?

【问题讨论】:

  • 我不确定我是否理解第一个问题。但是要回答第二个问题,您的 BehaviorSubject 是私有的,因此您将无法从组件中调用它。最好将 BehaviorSubject 设为服务私有,以确保没有其他代码修改它。
  • @DeborahK 感谢您的回复。实际上第一个问题提到如果我在我的服务的 create() 方法中调用 setEvent()(不是这个 proxyService,我的意思是我保留我的 CRUD 方法的其他服务)怎么办?有什么想法吗?
  • @DeborahK 对于第二个问题,我问我在CRUD方法中通过setEvent()方法调用next(),在创建、更新、删除操作完成后。这是一个好方法吗,在现实世界的例子中是否有更好的方法,例如正如我在第一个问题中所问的那样,在服务 (CRUD) 中调用 next()。 有什么想法吗?

标签: angular typescript rxjs behaviorsubject


【解决方案1】:

我认为您的设计与 BehaviourSubject 相得益彰(至少在我看来)。

我可以建议的一件事是在单例服务中尝试 BehaviourSubject。 (在你的情况下我看不到)

如果我在我的服务的 create() 方法中调用 setEvent() 会怎样(不是这个 proxyService,我的意思是我保留 CRUD 的其他服务 方法)

如果我正确理解了您的问题,答案是否定的。

因为从另一个服务调用服务方法是不可取的,所以保持简单。在实际项目中,一旦执行了 CRUD 方法,我们将尝试借助服务方法(但不在服务中)刷新组件本身的数据。

我在CRUD方法中通过setEvent()方法调用next(),创建、更新、删除操作完成后。是不是一个好 方法,在现实世界的例子中有更好的方法,例如打电话 我在第一个问题中提出的服务(CRUD)中的 next()

是的,这是一个很好的方法。

【讨论】:

【解决方案2】:

我个人认为您目前的方法是完全有效的。您可以考虑添加限制规则,就像您已经提到的那样,只需从您的服务层调用setEvent。这将改善组件的单一职责。无论如何,我认为这实际上取决于您项目的规模和生命周期。对于开始一个项目,所以肯定会像你一样做!

【讨论】:

  • 感谢您的回复。 1) 如果您在自己的应用中使用 BehaviorSubject,那么您在实际项目中的用途是什么?在 CRUD 操作完成后,您是否从 Controller 的 CRUD 方法(create()、update() 等)调用 next(此处为 setEvent() 方法)? 2) 另一方面,如果我在组件级别调用 next(),例如 create() 方法,我将不得不为每个 create() 方法调用调用 next()。出于这个原因,我想到在服务(crud)级别调用 next() (从组件中的 create 方法调用的服务中的 create 方法)。有什么想法吗?
猜你喜欢
  • 2017-11-18
  • 2017-02-02
  • 2017-05-04
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-07
  • 1970-01-01
相关资源
最近更新 更多