Ответ 1
Фактически, это нормальное поведение и Angular2 не поддерживает глубокое сравнение. Он основан только на сравнительном сравнении. См. Эту проблему: https://github.com/angular/angular/issues/6458.
Это говорит о том, что они являются обходными решениями для уведомления директивы о том, что некоторые поля в объекте были обновлены.
-
Ссылка на директиву из компонента
export class AppComponent { test: { one: string; } = { one: '1' } @ViewChild(MyDirective) viewChild:MyDirective; clicked() { this.test.one = '4'; this.viewChild.testChanged(this.test); } }
В этом случае метод testChanged для директивы называется явно. См. Этот plunkr: https://plnkr.co/edit/TvibzkWUKNxH6uGkL6mJ?p=preview.
-
Использование события в службе
Выделенная служба определяет событие
testChanged
export class ChangeService { testChanged: EventEmitter; constructor() { this.testChanged = new EventEmitter(); } }
Компонент использует службу для запуска события
testChanged
:export class AppComponent { constructor(service:ChangeService) { this.service = service; } clicked() { this.test.one = '4'; this.service.testChanged.emit(this.test); } }
Директива подписывается на это событие
testChanged
, чтобы получать уведомленияexport class MyDirective implements OnChanges,OnInit { @Input() test: { one: string; } = { one: "" } constructor(service:ChangeService) { service.testChanged.subscribe(data => { console.log('test object updated!'); }); } }
Надеюсь, это поможет вам, Thierry