Проблема с обнаружением изменений. Почему это изменяется, когда это одна и та же ссылка на объект с On Push

Я подумал, что я довольно четко объясняю, как работает обнаружение угловых изменений после этого обсуждения: почему обнаружение изменений не происходит здесь, когда [значение] изменилось?

Но посмотрите на этот плунж: https://plnkr.co/edit/jb2k7U3TfV7qX2x1fV4X?p=preview

@Component({ selector: 'simple', template: ` 
{{myData[0].name}}
`, changeDetection: ChangeDetectionStrategy.OnPush }) export class Simple { public @Input() myData; constructor() { } public onClick() { } }

Нажмите a, он изменился на c

Я понимаю, что событие click вызывает обнаружение изменений на уровне приложения, но [myData] = “testData” все еще относится к одному и тому же объекту, и я использую On Push on Simple, почему это изменение изменилось?

Это по дизайну.

Если у вас есть компонент с обнаружением изменений OnPush то функция detectChangesInternal не будет detectChangesInternal если не произойдет одна из четырех вещей:

1) изменяется одна из его @Inputs

~ 2.4.x введите описание изображения здесь

~ 4.xx введите описание изображения здесь

Примечание: @Input s должен быть представлен в шаблоне. См. Вопрос https://github.com/angular/angular/issues/20611 и комментарий

2) связанное событие запускается из компонента ( это ваш случай )

Оговорки: здесь есть разница между 2.xx и 4

Угловая ChangeDetectionStrategy.OnPush с дочерним компонентом, испускающим событие

~ 2.4.x введите описание изображения здесь

~ 4.xx введите описание изображения здесь

3) вы вручную отмечаете проверяемый компонент ( ChangeDetectorRef.markForCheck() )

4) Асинхронные вызовы вызовов ChangeDetectorRef.markForCheck() внутренне

 private _updateLatestValue(async: any, value: Object): void { if (async === this._obj) { this._latestValue = value; this._ref.markForCheck(); } } 

https://github.com/angular/angular/blob/2.4.8/modules/%40angular/common/src/pipes/async_pipe.ts#L137


Другими словами, если вы установите OnPush для компонента, то после того, как статус первого проверяющего компонента будет изменен с CheckOnce на Checked и после этого он ждет, пока мы не изменим статус. Это произойдет в одной из трех вещей выше.

Смотрите также:

Есть также хорошие объяснения того, как работает работа с угловыми изменениями:

Вот пример Live (спасибо Paskal), который объясняет onPush изменений onPush . ( Comp16 похож на ваш компонент, и вы можете щелкнуть по нему).

  • Динамически добавлять слушателя событий в Angular 2
  • Угловое redirect на страницу входа в систему
  • Как заставить Angular2 связывать компонент в innerHTML
  • Возможна ли уклон 2 объекта через параметры маршрута?
  • Как я могу ограничить повторение ngFor некоторым количеством элементов в Angular?
  • Угловая 2 | Директивы Аргумент типа '{}' не присваивается
  • Угловой 2.0 маршрутизатор не работает при перезагрузке браузера
  • Angular2: приложение аварийно завершает работу / становится невосприимчивым после обнаружения исключения / ошибки
  • Циркулярная зависимость впрыска угловая 2
  • Как использовать * ngIf else в Angular?
  • Соединение плоских данных
  • Давайте будем гением компьютера.