Возвращать тему только для подписки - PullRequest
0 голосов
/ 25 января 2019

мой вопрос касается возврата ссылки на тему, не позволяя получателю выполнить .next () по теме.

Например, у меня есть служба, которая содержит тему и может инициировать новые события насубъект

class ExampleService {
  private exampleSubject = new Subject<boolean>;

  // Ideally the only way to call next on the subject
  doNext() {
    this.exampleSubject.next(true);
  }

  getSubject() {
    // Ideally returning a reference to the subject but only with the 
    // ability to subscribe and listen for events, not to call .next()
    return this.exampleSubject;
  }
}

Опять же, я ищу способ, позволяющий другим компонентам вызывать эту услугу и получать тему, но иметь возможность только подписываться и прослушивать изменения, которые они не должны делатьизменения.

ExampleService.getSubject().subscribe(() => {
  //do something 
}) // ok
ExampleService.getSubject().next(true) // error/not allowed

1 Ответ

0 голосов
/ 25 января 2019

Официально рекомендуемый способ сделать это (при условии, что вы используете TypeScript) состоит в том, чтобы принудительно перепечатывать Subject to Observable (Subject Observable, как и любой другой):

class ExampleService {
  private exampleSubject = new Subject<boolean>();
  observable$: Observable<boolean> = this.exampleSubject;

  ...
}

Теперь observable$ можетбыть публичным, потому что это просто обычная наблюдаемая.TypeScript не позволяет вам вызывать, например, ExampleService.observable$.next(), потому что этот метод не существует в Observables.

Если вы используете только JavaScript, вы можете использовать exampleSubject.asObservable() для возврата Observable от субъекта.

Эта дискуссия о GxHub RxJS также актуальна: https://github.com/ReactiveX/rxjs/pull/2408

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...