NgChanges on runs on input bindings - if the input is a reference type - when the reference changes. Ie an object like this:
{ value: 2 }
will not cause ngchanges to run if its value property is changed. This is because the Angular default change detection strategy compares the references.
Angular2 change detection: ngOnChanges not firing for nested object
However this appears to be contradictory to me when we think about the two change detection strategies:
Default - change detection for component happens when bindings change - but according to above this doesnt recognise changes on inputs where the reference type's reference hasnt changed. Or in other words change detection runs only when value type value changes or reference type reference changes.
OnPush - change detection runs only value type value changes or when a reference changes.
Clearly default change detection doesnt work like I understand it to or it would be the same as OnPush, yet the onChanges lifecycle hook seems to only fire under the same rules as OnPush.