У меня есть дочерний TestComponent
компонент следующим образом:
import { Component, OnInit, Input } from '@angular/core';
import { ApiService } from '../../../api.service';
@Component({
selector: 'app-test',
templateUrl: './test.component.html'
})
export class TestComponent implements OnInit {
constructor(private apiService: ApiService) { }
testDisplayMessage = 'No data to show';
ngOnInit() {
}
getMessage(param: string) {
this.callingTest = true;
this.apiService.getTest( param ).subscribe( data => {
this.setTestDisplayMessage( data );
this.callingTest = false;
}, err => {
console.log( JSON.stringify( err ) );
this.setTestDisplayMessage( 'Failed to get data' );
this.callingTest = false;
} );
}
setTestDisplayMessage( message: string ) {
this.testDisplayMessage = message;
}
}
содержимое test.component.html
<p style="padding: 10px;">{{ testDisplayMessage }}</p>
Использование в родительском компоненте:
Trigger JSКод в родительском компоненте при нажатии кнопки,
import { TestComponent } from './test/test.component';
....
.....
@Component({
providers: [ TestComponent ],
templateUrl: 'parent.component.html'
})
export class ParentComponent implements OnInit {
...
constructor(private testComponent: TestComponent) { }
...
// Button on parent template triggers this method
getMessage() {
this.testComponent.getMessage('Hello');
}
...
}
HTML-тег, добавленный в родительский компонент,
<app-test></app-test>
Когда я отлаживаю выше точки триггера кода, вызов setTestDisplayMessage()
происходит в поле testDisplayMessage
в TestComponent
изменяется, но пользовательский интерфейс показывает старое сообщение 'No data to show'
, почему сообщение об изменении не отражается в шаблоне пользовательского интерфейса?Или это не так, как это должно привыкнуть?Должен ли я использовать @Input
Обновление:
Исходя из указателей, приведенных в следующих ответах, а также в разделах комментариев, я изменил свой компонент как @ViewChild
, поэтомуВ вышеприведенном родительском компоненте вместо передачи дочернего компонента в качестве аргумента в конструктор я объявил его как дочерний компонент, используя @ViewChild
, поэтому код изменяется следующим образом:
Ранее неправильный код
constructor(private testComponent: TestComponent) { }
Решение
@ViewChild(TestComponent)
testComponent: TestComponent;
Я нашел эта статья полезной.