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

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

Оба компонента являются потомками третьего компонента. (в основном детско-детское общение)

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

export class OrderListComponent {
page = 1;
Orderlist: SingleOrder[];
ngOnInit() {}
populateOrderList(){
    this.service.refreshList()
    .subscribe(
    data => {
       this.Orderlist = data;
       this.page=2;
       console.info(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.info(this.page);// printing as 2 in logs
    })}

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

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

Prashant Pimpale 09.04.2019 07:44
Тестирование функциональных 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
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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.info(this.page);// printing as 2 in logs
    });
  });

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

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

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

providers: [OrderListComponent]

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

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

sreenivas 09.04.2019 09:30

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