【问题标题】:Angular >2 Subject subscribe directly or use a method?Angular > 2 Subject 直接订阅还是使用方法?
【发布时间】:2017-12-25 19:59:10
【问题描述】:

我有一个主题成员的服务。 Subject 提供了一个类的实例:

public selectedProjectSubject: Subject<Project> = new Subject();

Subject 的值是用一个方法更新的:

public updateSelectedProject(project: Project) {
    this.selectedProjectSubject.next(project);
  }

在几个课程中我订阅了主题:

this.projectSubscription = this.projectService.selectedProjectSubject.subscribe((project: Project) => {
      this.projectSelected = project;
    });

直接订阅 Subject 或为 Subject (Observable) 提供其他方法是一种好习惯吗?

【问题讨论】:

  • 如果您希望在应用程序的不同位置共享您的项目对象,并在将新项目传递给主题时随处更新它,那么这是要走的路。您不应该使用方法返回主题本身,只需订阅它即可。
  • 感谢您的回答。
  • 不客气。 RxJS 和 Observables 倾向于遵循函数式编程范式,因此你应该尽量避免使用 setter 和 getter :-)

标签: angular typescript rxjs


【解决方案1】:

我在很多地方使用BehaviorSubject,我想劝阻我的队友不要在包含主题的服务之外使用.value,所以我通常对所有主题执行以下操作:

private _selectedProject = new Subject<Project>();
get selectedProject(): Observable<Project> {
  return this._selectedProject;
}

但是,以您拥有它的方式访问它并没有太大的问题,如果您需要它,您可以随时更改我的方法,甚至无需重构任何调用者,只需使用 get 访问器.

【讨论】:

  • 这是我的困惑。 A (Behaviour)Subject 是订阅它的 Observable。但是我的 OO 背景说这个类成员应该用 getter 和 setter 封装和公开。但我可以想象这种方法在 JavaScript RxJs 中是不同的。
  • OO 教授封装,而不是 getter 和 setter。一个类应该有一个公共 API 和一个私有 API。 Java 推广 getter 和 setter 是因为它允许将来进行重构,而不是因为它提供了封装。具有标准 getter/setter 的字段未封装。您选择的项目是否应该被封装?这取决于服务的目的。服务存储应用程序的当前状态并封装应用程序的业务逻辑。组件负责显示和 I/O 操作。
  • 例如。也许您希望页面的一部分显示当前选择的项目名称。如果你想封装项目,那么你应该创建一个公开名为selectedProjectName 或类似名称的可观察对象。是否应该封装当前选择的项目更为细微。如果所选项目有 10 个字段,并且您想显示所有字段,那么封装所选项目对象并为所有字段创建 getter 将是愚蠢的。
  • 我个人的偏好是拥有一个 CurrentProjectService 来控制当前选定的项目并将其公开为可观察的。服务的公共 API 将是 setSelectedProject(project: Project)get selectedProject(): Observable&lt;Project&gt; 和可能的 clearSelectedProject(): void
  • 感谢您的时间和解释。但是,我不同意您关于封装的观点:Java 中的封装是一种将数据(变量)和作用于数据(方法)的代码作为一个单元包装在一起的机制。在封装中,一个类的变量对其他类是隐藏的,只能通过其当前类的方法访问。因此,它也被称为数据隐藏。
猜你喜欢
  • 2019-12-29
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
  • 2016-10-09
  • 2017-03-12
  • 2016-12-04
  • 2016-06-10
  • 1970-01-01
相关资源
最近更新 更多