Безопасно ли подвергать ваших RxJS субъектов «внешнему миру»? - PullRequest
0 голосов
/ 07 сентября 2018

Я прочитал эту хорошую статью на Стратегия обнаружения угловых изменений onPush

в какой-то потин он написал:

Это анти-паттерн - выставлять ваш объект внешнему миру, всегда выставлять наблюдаемое, используя метод asObservable ().

но он не объясняет почему. Значит ли это, что я не должен делать что-то подобное?

export class ExampleComponent {

  public drawerTrigger$ = new Subject<{}>(); 
}

и в HTML

  <button  class="hamburgher-button" type="button"
     (click)="drawerTrigger$.next($event)">
    <i >menu</i>
  </button>

если нет, то как правильно?

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

В общем, вы не должны выставлять Subject s, потому что это дает любому, кто пользуется вашей услугой, возможность бесконтрольного вызова drawerTrigger$.next() даже в неправильных сценариях использования.

Даже в наихудших ситуациях каждый может использовать drawerTrigger$.error() или drawerTrigger$.complete(). Субъекты имеют внутреннее состояние, и если они излучают error или complete, субъект помечается как остановленный и никогда не будет излучать ничего. Если вы выставите свой Subject, тогда вы позволите кому-либо отправлять эти уведомления.

Официально рекомендуемый способ выставления объектов из классов TypeScript - просто принудительно устанавливать их типы на Observable. Вам не нужно использовать asObservable() (RxJS сам по себе не использует asObservable() где-либо в своей кодовой базе):

export class ExampleComponent {
  private drawerTriggerSubject = new Subject<{}>(); 
  public drawerTrigger$: Observable<{}> = this.drawerTriggerSubject;
}
0 голосов
/ 07 сентября 2018

Если честно, это не имеет большого значения.

Когда вы пишете это

export class X {
  private subject = new Subject();
}

Вы по-прежнему можете получить доступ к теме с помощью

const x = new X();
x['subject'].next('value');

Так что на самом деле это скорее интеллигентное удобство, чем хорошая / плохая практика.

Я бы посоветовал вам делать все, что угодно: если вам нужен доступ к вашей теме, то установите ее для публичного доступа; если нет, не раскрывайте ее.

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