Обновленные поля компонента не изменяются в пользовательском интерфейсе

#angular

#angular

Вопрос:

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

Оба компонента являются дочерними по отношению к третьему компоненту. (В основном дочерняя связь)

Первый компонент (OrderListComponent):

 export class OrderListComponent {
page = 1;
Orderlist: SingleOrder[];
ngOnInit() {}
populateOrderList(){
    this.service.refreshList()
    .subscribe(
    data => {
       this.Orderlist = data;
       this.page=2;
       console.log(this.page);// printing as 2 in logs
    })}
  

Первый компонент HTML выглядит следующим образом:

 <label>{{page}}</label> // printing 1 as it is set by default in code
  

Второй компонент (вызывающий):

  // Second component (Single-Order)
 @Component({
  providers: [OrderListComponent]
 })
 export class SingleOrderComponent implements OnInit {
constructor(private orderlist:OrderListComponent ) {}
onSubmit(form: NgForm) {
   this.orderlist.populateOrderList();
}}
  

Я попытался изменить код первого компонента, как показано ниже, с помощью детектора изменений

Первый компонент (OrderListComponent):

 @Component({
  changeDetection: ChangeDetectionStrategy.OnPush//tried default strategy also but no change
})
export class OrderListComponent {
page = 1;
Orderlist: SingleOrder[];
ngOnInit() {}
populateOrderList(){
    this.service.refreshList()
    .subscribe(
    data => {
       this.Orderlist = data;
       this.page=2;
       this.cd.detectChanges(); // used this but no change
       // tried this.cd.markForCheck() , even no change
       console.log(this.page);// printing as 2 in logs
    })}
  

Хотел увидеть значение 2 в пользовательском интерфейсе, но получил только 1. Поскольку я новичок в angular 7, не удалось быстро найти. Пожалуйста, помогите мне в этом…

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

1. Можете ли вы привести пример stackblitz?

Ответ №1:

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

В вашем сервисе есть @Output свойство, которое будет EventEmitter :

 @Output() triggerChange: EventEmitter<any> = new EventEmitter();
  

Введите эту службу в SingleOrderComponent и вызовите emit EventEmitter метод следующим образом:

 constructor(private service: CommunicationService) { }
 onSubmit(form: NgForm) {
    this.service.triggerChange.emit();
 }
  

А в другом компоненте внедрите ту же службу и просто подпишитесь на это событие:

 this.service.triggerChange.subscribe(()=>{
  this.service.refreshList()
    .subscribe(data => {
       this.page=2;
       console.log(this.page);// printing as 2 in logs
    });
  });
  

И когда генерируется событие, вы можете вызвать refreshList() обновление вашего компонента.

Это рабочий пример в Stackblitz: https://stackblitz.com/edit/angular-cancvb

Кроме того, вы каждый раз вводите новый экземпляр компонента, как и раньше :

 providers: [OrderListComponent]
  

Таким образом, внесенные вами изменения не отражаются в компоненте в DOM.

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

1. Спасибо за ваше четкое объяснение, и это сработало для меня.