Как открыть диалоговое окно и передать данные из объекта поведения?

#angular

Вопрос:

Есть тема для пользователей:

 public users$ = new BehaviorSubject();
 

Внутри компонента я получаю пользователей в качестве наблюдателя:

 class Component {
   public users$: Observable<User>;
   public move() {
        if(this.users$.length) {
           this.dialog.open(DialogComponeent, {});
        }
   }
}
 

Итак, мне нужно получить значение из users$ метода in move() и передать его в диалоговое окно. Как это сделать?

Комментарии:

1. Учитывая, что это a , вы можете использовать его для получения последнего значения. users$ BehaviorSubject this.users$.value

2. Проблема в том, что мне нужно дублировать код, поэтому поместите public users$: BehaviorSubject<User>; его также в компонент

3. Я хочу справиться с этим, используя подход rxjs

4. Как и когда это move называется? Что произойдет, если вы позвоните move и только после этого user$ значение изменится?

5. Он вызывается из темы onclick

Ответ №1:

Вы можете получить доступ к значению объекта BehaviorSubject непосредственно в этот момент. Ваш код должен быть таким:

Простой способ:

 class Component {
   public users$: Observable<User>;
   public move() {
        if(this.users$.value.length) {
           this.dialog.open(DialogComponeent, {
             data: this.users$.value
           });
        }
   }
}
 

Более удобный способ:

 class Component {
   public users$: Observable<User>;
   public move() {
        this.users$.pipe(
          first(),
          filter(value => value.length),
        ).subscribe(value => 
          this.dialog.open(DialogComponeent, {
             data: value
          })
        );
   }
}
 

Комментарии:

1. Где показать сообщение о том, что длина равна нулю?

2. Какой идентификатор пользователя вызывает метод move() во второй раз, будет ли он работать?

3. это будет работать в любое время, когда вы вызываете move() метод

4. Если вы хотите, чтобы значение синтаксического анализа равнялось 0 и отображало ошибку, например, вы можете удалить filter инструкцию pipe и check if внутри подписки.