Angular 5 Поведенческая тема

У меня есть форма, которая принимает input, и эта input будет использоваться моим API для извлечения данных. Что касается angular, я могу использовать @input или Behavioural subject для разделения этого значения с дочерними компонентами или несвязанными компонентами.

Поскольку мой ввод будет одноразовым действием, почему я не могу использовать службу с частной переменной, чтобы поделиться ею с различными компонентами, вместо того, чтобы использовать @input и Behavioral subject?

Я говорю:

В шаблоне:

<html>
  <body>

    EmployeeID <input type="text">

    <button type="submit" (click) ="onsubmit()>Submit</button>

  </body>
</html>

В компоненте:

onsubmit() {
  this.myservice.addData(inputValue)
}     

А в сервисе:

private myinput    

addData(input){
  this.myinput.add(input)
}

И это всего лишь примерный код, а не реальный ..


person NewBee    schedule 03.10.2018    source источник
comment
Кто сказал, что ты не можешь этого сделать? ИМО, это было бы против хорошей практики, но этот код довольно действителен.   -  person Mateusz Witkowski    schedule 03.10.2018
comment
@MateuszWitkowski, когда именно мы должны использовать Behavioursubject ... каков правильный вариант использования? И если вы имеете в виду лучшую практику ... где я могу найти более подробную информацию об этом ...   -  person NewBee    schedule 03.10.2018
comment
Вы могли бы использовать BehaviorSubject, когда есть вероятность, что значение изменится и ваш нижестоящий компонент должен быть уведомлен об этом изменении.   -  person Henry    schedule 03.10.2018
comment
Поведенческий субъект объясняется здесь: behaviorubject-vs-observable   -  person HDJEMAI    schedule 03.10.2018


Ответы (1)


Ну, конечно, ты можешь ... вроде как. Частные переменные доступны только внутри их собственного класса, поэтому это должна быть общедоступная переменная.

Однако вы потеряете главное преимущество BehaviorSubject. Если значение совместно используется несколькими компонентами, преимущество наличия Subject состоит в том, что эти подписчики будут обновляться асинхронно с этим значением при установке этого значения. В противном случае эти компоненты должны были бы обнулить это значение вместо того, чтобы просто получать его в ответ. Эти компоненты также будут получать обновления этого значения реактивно, поэтому, если это значение обновляется, а не остается статическим, BehaviorSubject становится гораздо более полезным.

Еще одно замечание: наличие значений как BehaviorSubjects или даже частных BehaviorSubjects в сервисе с asObservable геттерами - это шаблон проектирования, обычно встречающийся в «магазинах» или сервисах с отслеживанием состояния, ставших популярными благодаря библиотекам, таким как @ ngrx / store.

Angular - это сильно реактивная программа, построенная на RxJS, но, в конце концов, использование Observables в вашем приложении по-прежнему является выбором дизайна.

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

person joh04667    schedule 03.10.2018