Refre sh наблюдается на основе изменения поведения в Angular (Rx JS) - PullRequest
0 голосов
/ 04 августа 2020

Я ищу способ обновить sh коллекцию наблюдаемых, которые отображаются в шаблоне ASYN C способом, когда пользователь изменяет переменную / свойство на сайте.

Сценарий прост: у нас есть несколько учетных записей, за которыми следят наши CSR, они входят в систему с профилем, а затем им предоставляется возможность изменить / просмотреть другую учетную запись.

Когда учетная запись изменяется, я испустить изменение учетной записи через BehaviorSubject и подписаться на событие в другом месте моего приложения, в качестве аргумента, /users.

В компоненте пользователей у меня есть несколько Observable, представляющих данные на этой странице (различные данные заканчиваются точек), и я подписываюсь на них в шаблоне с помощью конвейера «asyn c».

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

Я рассмотрел возможность добавления субъектов поведения в веб-службы, но это не работает. Пометка страницы для изменений или запуск проверки изменений на странице также не имеет никакого эффекта.

Для справки:

users$: Observable<User[]>;

/** onInit **/
this.users$ = this.service.retrieveusers(); // returns Observable<User[]>

this.accountService.changed.subscribe(x => {
   this.users$ = this.service.retrieveusers(); // this does not work because it's unaware of changes
});

Я попытался заключить вызов в новый BehaviorSubject на основе некоторых сообщений, которые я прочитано, но тоже не имеет эффекта;

update = new BehaviorSubject<boolean>(false);

/** onInit **/
this.users$ = this.service.retrieveusers(); // returns Observable<User[]>

this.accountService.changed.subscribe(x => {
   this.update.next(true);
});

this.update.subscribe(x => {
   this.users$ = this.service.retrieveusers(); // this does not work because it's unaware of changes
});

Вышеупомянутое также не имеет никакого эффекта.

Как мне go об обновлении пользователей $ при запуске accountService.changed?

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

, который не работает, потому что u перебирает наблюдаемый объект this.users $ вместо того, чтобы испускать новое значение для того же наблюдаемого.

Способ использования BehaviourSubject для обновления DOM:

инициализируйте BehaviourSubject следующим образом:

private MyBehaviourSubject = new BehaviourSubject(/*initial value here*/)

private MyBehaviourObservable = this.MyBehaviourSubject.asObservable()

Итак. Чтобы ваше представление постоянно обновлялось, вам нужно сделать в своем шаблоне:

// with this your view always been refreshed after a new emission 
    {{MyBehaviourObservable | async }}

А чтобы выдать новое значение, вам нужно сделать что-то вроде этого:

// when you do this your view will be updated.
    this.MyBehaviourSubject.next(/*new value here*/)
0 голосов
/ 04 августа 2020

Ваш действительно близок, вам просто не хватает канала и mergeMap.

/** onInit **/
this.users$ =  this.accountService.changed.pipe(
    mergeMap(() => this.service.retrieveusers())
)

Если мы предполагаем, что при изменении будет сначала выдано значение, то приведенный выше код должен работать. Если при изменении не будет изначально генерироваться значение, то нам нужно использовать RX JS для генерации начального значения для запуска вызова службы для retrieveuser (). Есть несколько различных способов достичь sh этого.

https://www.learnrxjs.io/learn-rxjs/operators/combination/startwith

/** onInit **/
this.users$ =  this.accountService.changed.pipe(
    startsWith({}),
    mergeMap(() => this.service.retrieveusers())
)

https://www.learnrxjs.io/learn-rxjs/operators/combination/concat

/** onInit **/
 this.users$ =  concat(of({}), this.accountService.changed).pipe(
    mergeMap(() => this.service.retrieveusers())
)

Очень рекомендую взглянуть на https://www.learnrxjs.io/learn-rxjs/operators

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