угловые - привязки срабатывают наблюдаемые - PullRequest
0 голосов
/ 02 октября 2018

Я ожидаю, что когда я установлю наблюдаемую подобную ситуацию, любые привязки будут использовать результат вызова switchMap:

this.thing = this.route.paramMap.pipe(
        switchMap(async (params: ParamMap) => {
            const id = +params.get('id');
            const data = await this.thingService.getThingDetails(id);
            return new ThingDisplay(data);
        })
    )

Однако, если у меня есть несколько привязок в виде {{ (thing | async)?.prop }} Я вижу, что сервисный метод называется для каждой из привязок .

Это означает, что каждое использование | async создает независимую подписку на this.thing Observable.

Как можно избежать этого?Я вижу угловые шаблоны, где я могу указать некоторый контекст, используя синтаксис let-* .... но мне интересно, есть ли более прямой способ, чем указание целого шаблона, посвященного этому .... в последний раз, когда я использовалMVVM это был knockoutjs, так что определенно была контекстная привязка, которую вы могли бы использовать .... есть ли что-то похожее в angular?Мне не повезло найти что-либо, поэтому любой совет был бы оценен.

Мне в первую очередь интересно

  • Должен ли я связываться с Observable в моем компоненте?
  • Должен ли я использовать мою подписку Observable для установки переменной экземпляра?Мне это странно ...
  • Почему | async заставляет Обсерваторию запускать каждый раз ?
  • Где я могу найти законно хорошую документацию по этому поводу?Похоже, что некоторые материалы покрыты документами angular, а некоторые - документами rxjs ... есть записи в блогах для каждой существующей версии angular, которые, возможно, устарели (с методами, которые я не могу найти, например getValue)... есть ли точный источник для что-нибудь в угловых (по крайней мере, в отношении наблюдаемых)?

1 Ответ

0 голосов
/ 02 октября 2018

Здесь происходит несколько вещей.Первые наблюдаемые являются многоадресными.Это означает, что для каждого подписчика функция в switchMap получает вызываемый.

Есть несколько возможных решений.Один из них - подписаться на this.thing и использовать ненаблюдаемую версию значения в вашем шаблоне.Делая это, вы избавляетесь от асинхронных каналов и должны очистить наблюдаемое при разрушении компонента.Или вы можете превратить наблюдаемое в Субъект (субъекты являются одноадресными) и по-прежнему использовать асинхронный канал в своем шаблоне.

...