Angular 5 View не обновляется с помощью модели

Я использую Angular версии 5.

Я загружаю данные из веб-службы Google Places с помощью Angular-Maps. Я запускаю службу для получения данных и загрузки их в переменную, скажем, «данные». В моем компоненте я подписываюсь на «данные», поэтому всякий раз, когда значение «данных» изменяется, мое представление должно обновляться.

Но что удивительно, когда значение «данных» изменяется, и я могу записать это изменение с помощью console.info, представление не обновляется? Он обновляется только тогда, когда я взаимодействую с каким-либо другим элементом в представлении.

Это снимок моей службы

  private rs = new BehaviorSubject<Object>(undefined);
  rd = this.rs.asObservable();

  constructor(private mapi: MapsAPILoader)
  {
    this.mapsAPILoader.load().then(() =>
    {
      this.ps = new google.maps.places.PlacesService(document.createElement('div'));
    });
  }

  fPi(pid: string)
  {
    this.ps.getDetails(
    { placeId: pid }, (pr, status) =>
    {
      if (status === 'OK')
      {
        this.extract(pr);
      }
    });
  }

  extract(pr)
  {
    let details = [];
    if (pr.formatted_address)
    {
      details.push({"field": "Address", "value": placeResult.formatted_address});
    }

    if (pr.international_phone_number)
    {
      details.push({"field": "Phone Number", "value": placeResult.international_phone_number});
    }
    this.update(placeDetails);
  }

  update(rd: Object)
  {
    console.info(rd);
    this.rs.next(rd);
  }

Это моя составная часть, где написано

this.service.rd.subscribe(rd =>
    {
      if (rd)
        this.data = Object.values(rd);
    });

А в HTML я просто делаю

<div *ngIf = "data">
    {{data}}
</div>

Итак, что здесь не так и что можно сделать, чтобы исправить это?

Было бы хорошо предоставить некоторый код, чтобы мы могли видеть, что вы делаете не так.

Husein Roncevic 05.04.2018 20:37

надеюсь, вы правильно выполнили привязку ...

Pranay Rana 05.04.2018 20:41

Код @HuseinRoncevic добавлен, пожалуйста, помогите

S K 05.04.2018 20:47

Внедрить ChangeDetectorRef в компонент и вызвать this.cdr.detectChanges () в обратном вызове подписки после назначения новых данных

Alexander Poshtaruk 05.04.2018 20:57

@AlexanderPoshtaruk - это хорошая практика - использовать ChangeDetector, даже если у нас есть привязка данных?

S K 05.04.2018 21:03

Вы используете обнаружение изменений OnPush?

Tomasz Kula 05.04.2018 21:24

Как предложил @TomaszKula, попробуйте использовать стратегию обнаружения изменений OnPush. Вы пытаетесь отслеживать изменения ссылочного типа, который может не сообщать об изменениях. Также попробуйте вызвать в this.data = rd, не проходя через Object.value(rd), просто чтобы посмотреть, работает ли он.

Husein Roncevic 05.04.2018 21:42

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

Alexander Poshtaruk 05.04.2018 22:07

@SK Я не думаю, что это хорошая практика. Обычно есть способ избежать прямого использования ChangeDetection ref. Это последнее, к чему я бы потянулся.

Tomasz Kula 05.04.2018 22:07
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
9
1 933
1

Ответы 1

Это пример того, как я справляюсь с подобной ситуацией в одном из моих компонентов. Главное здесь то, что я создаю Observable, а затем назначаю ответ поведения объекта Observable. Затем я использую асинхронный канал в шаблоне, который гарантирует, что все будет правильно отписано. Вот пример почти такой же петли, которую вы делаете выше:

import { Component, OnInit, Input, ViewChild } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { PitchingInitiativesService } from '../../services/pitching-initiatives.service';
import { EventService } from 'app/services/events/events.service';


@Component({
    selector: 'app-pitching-table',
    templateUrl: './pitching-table.component.html'
})

export class PitchingTableComponent implements OnInit {

    @Input() searchText = '';
    searchKey = 'name';
    table: any = [];

    constructor(
        private pitching: PitchingInitiativesService,
        private events: EventService
    ) {}

    ngOnInit() {
        this.pitching.getPitchingSubject();
        this.pitching.pitchingResponse$.subscribe(response => this.table = response);
    }

    editPi(id = null) {
        this.events.pitchingId(id);
    }

    editMilestones(id) {
        this.events.milestonesId(id);
    }

    archivePi(id) {
        this.pitching.postArchivePitch(id).subscribe(response => {
            this.pitching.getPitchingSubject();
        });
    }

}

а затем в моем шаблоне я повторяю Observable, используя асинхронный канал:

<tr *ngFor = "let row of table | async | filter: searchText : searchKey">

Надеюсь, это поможет...

Другие вопросы по теме