服务中RxJs BehaviorSubject的next()方法

时间:2019-08-07 20:13:26

标签: angular typescript rxjs behaviorsubject

我使用以下方法来在添加新记录后刷新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);
    }
}

CreateComponent:

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)因为我也像this.eventProxyService.setEvent(param);方法一样在update()方法中调用create(),所以最好在我的服务级别中调用它组件级别?

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

2 个答案:

答案 0 :(得分:1)

我个人认为您当前的方法完全有效。您可以考虑添加限制规则(如前所述),仅从服务层调用import re regex = r"^.*?<(\d+)>_<(\d+)>.*$" test_str = """ SomeText<192>_<283>.value SomeText<>_<>.value SomeOtherText_<192>r962<283>xyz """ subst = "SomeOtherText_<\\1>r962<\\2>xyz" print(re.sub(regex, subst, test_str, 0, re.MULTILINE)) 。这将提高组件的单一职责。无论如何,我认为这确实取决于项目的规模和寿命。对于开始一个项目,绝对可以像您一样做!

答案 1 :(得分:1)

我认为您使用 BehaviourSubject 的设计就可以了(至少在我看来是这样)。

我可以建议的一件事是在根范围单例服务中使用 BehaviourSubject 。 (在您的情况下我不会注意到)

  

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

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

由于不建议从另一个服务中调用服务方法,因此请保持简单。在现实世界的项目中,一旦执行CRUD方法,我们将尝试借助Service方法从Component本身刷新数据(但不在服务中。)

  

我在CRUD方法中通过setEvent()方法调用next(),在创建,更新,删除操作完成之后。好不好   这种方法,在现实世界中的示例中有更好的方法呼唤   我在第一个问题中问到的服务(CRUD)中的next()

是的,这是一个好方法。