Angular 7 - перезагрузка / обновление данных разных компонентов - PullRequest
0 голосов
/ 19 февраля 2019

Как обновить данные в другом компоненте 1 при внесении изменений в компонент 2. Эти два компонента не находятся под одним родительским узлом.

customer.service.ts

export class UserManagementService extends RestService {

  private BASE_URL_UM: string = '/portal/admin';

  private headers = new HttpHeaders({
    'Authorization': localStorage.getItem('token'),
    'Content-Type': 'application/json'
  });

  constructor(protected injector: Injector,
    protected httpClient: HttpClient) {
    super(injector);
  }
  getEapGroupList(): Observable < EapGroupInterface > {
    return this.get < GroupInterface >
      (this.getFullUrl(`${this.BASE_URL_UM}/groups`), {
        headers: this.headers
      });
  }

  updateGroup(body: CreateGroupPayload): Observable < CreateGroupPayload > {
    return this.put < GroupPayload >
      (this.getFullUrl(`${this.BASE_URL_UM}/group`), body, {
        headers: this.headers
      });
  }
}

Component1.ts

export class UserGroupComponent implements OnInit {

  constructor(private userManagementService: UserManagementService) {}

  ngOnInit() {
    this.loadGroup();
  }

  loadGroup() {
    this.userManagementService.getEapGroupList()
      .subscribe(response => {
        this.groups = response;
      })
  }

}
<mat-list-item *ngFor="let group of groups?.groupList" role="listitem">
  <div matLine [routerLink]="['/portal/user-management/group', group.groupCode, 'overview']" [routerLinkActive]="['is-active']">
    {{group.groupName}}
  </div>
</mat-list-item>
<mat-sidenav-content>
  <router-outlet></router-outlet>
</mat-sidenav-content>

component2.ts

setPayload() {
  const formValue = this.newGroupForm.value
  return {
    'id': '5c47b24918a17c0001aa7df4',
    'groupName': formValue.groupName,
  }
}

onUpdateGroup() {
    this.userManagementService.updateGroup(this.setPayload())
      .subscribe(() => {
          console.log('success);
          })
      }

Когда я обновляю API onUpdateGroup () в component1 , loadGroup () должен обновляться в component2

Ответы [ 4 ]

0 голосов
/ 14 июня 2019
Write a common service and call the same in both components.
like below:

common service: 
           dataReferesh = new Subject<string>();
           refereshUploadFileList(){
            this.dataReferesh.next();
            }

component2.ts:

    setPayload() {
      const formValue = this.newGroupForm.value
      return {
        'id': '5c47b24918a17c0001aa7df4',
        'groupName': formValue.groupName,
      }
    }

        onUpdateGroup() {
         this.userManagementService.updateGroup(this.setPayload())
           .subscribe(() => {
             this.shareservice.refereshUploadFileList(); 
               })
           }

And component1.ts:


         ngOnInit() {
         this.loadGroup();
         this.shareservice.dataReferesh.subscribe(selectedIndex=> this.loadGroup());
          }
0 голосов
/ 19 февраля 2019

Переместите код, который извлекает данные в службу, чтобы служба поддерживала groups.

Затем оберните эти данные в Компоненте 1 в получателе:

get groups() {
  return this.userManagementService.groups
}

Затем каждыйКогда данные изменяются, внедрение зависимостей Angular автоматически вызывает метод получения и получает самые последние значения.

Пересмотренный сервис

export class UserManagementService extends RestService {
  groups;
  private BASE_URL_UM: string = '/portal/admin';

  private headers = new HttpHeaders({
    'Authorization': localStorage.getItem('token'),
    'Content-Type': 'application/json'
  });

  constructor(protected injector: Injector,
    protected httpClient: HttpClient) {
    super(injector);

    // Get the data here in the service
    this.loadGroup();
  }

  getEapGroupList(): Observable < EapGroupInterface > {
    return this.get < GroupInterface >
      (this.getFullUrl(`${this.BASE_URL_UM}/groups`), {
        headers: this.headers
      });
  }

  loadGroup() {
    this.getEapGroupList()
      .subscribe(response => {
        this.groups = response;
      })
  }

  updateGroup(body: CreateGroupPayload): Observable < CreateGroupPayload > {
    return this.put < GroupPayload >
      (this.getFullUrl(`${this.BASE_URL_UM}/group`), body, {
        headers: this.headers
      }).pipe(
         // Reget the data after the update
         tap(() => this.loadGroup()
      );
  }
}

Пересмотренный компонент 1

export class UserGroupComponent implements OnInit {
    get groups() {
      return this.userManagementService.groups
    }

  constructor(private userManagementService: UserManagementService) {}

  ngOnInit() {

  }
}

ПРИМЕЧАНИЕ. Этот код не был проверен по синтаксису!

У меня есть похожий рабочий пример: https://github.com/DeborahK/Angular-Communication/tree/master/APM-FinalWithGetters

(Проверьте продукт-файлы папки оболочки вместе с product.service.ts)

0 голосов
/ 19 февраля 2019

В сети много примеров, вы можете использовать «Subject» и Output EventEmitter.Оба будут работать.В следующем примере приведен пример кода общего сервиса.Попробуйте использовать его.

@Injectable()
export class TodosService {
  private _toggle = new Subject();
  toggle$ = this._toggle.asObservable();

  toggle(todo) {
    this._toggle.next(todo);
  }
}

export class TodoComponent {
  constructor(private todosService: TodosService) {}

  toggle(todo) {
    this.todosService.toggle(todo);
  }
}

export class TodosPageComponent {
  constructor(private todosService: TodosService) {
    todosService.toggle$.subscribe(..);
  }
}
0 голосов
/ 19 февраля 2019

Создайте @Injectable класс обслуживания с предметом в нем.Пусть оба компонента изучат тему этого класса обслуживания, чтобы понять, что и когда делать.Один класс может вызывать .next () для субъекта, а другой может подписаться на него и вызывать свою собственную функцию, когда он получает обновление.

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