... путем обертывания всей логики компонентов (включая логику некомпонентных директив внутри компонента) в зоне, тогда только этот компонент источника должен быть проверен на изменения вместе с любыми дочерними компонентами с измененными входами из исходный компонент, если все изменения следуют за однонаправленным потоком. Разве это понимание звучит?
Когда шаблон переплете срабатывает событие – например, (click)="doSomething()"
– метод doSomething()
свободно изменять любые компонента или приложения данных.Шаблон заявления, такие как наш обработчик события doSomething()
, не связаны правилом однонаправленного потока, согласно Angular docs:
В ответ на события, это другая сторона «однонаправленного потока данных» угловой в. Мы можем изменить что угодно, где угодно, во время этого цикла цикла событий.
Вот почему по умолчанию обнаружение изменений Углового должно проверять каждое привязку к шаблону в каждом компоненте после возникновения события. (Ну, после того, как произойдет событие в пределах Угловой зоны.) Угловой не знает, что могло измениться ... он должен узнать, что изменилось.
unidirectional flow rule относится к шаблону выражения таких как {{some expression}}
или [childInputProperty]="parent expression"
или если вы реализуете метод ввода свойства сеттера: @Input() set childInputProperty(variableName:type) { ... }
.
Эта стратегия обнаружения изменений доступна в Angular2?
Нет, потому что это серьезно ограничивает возможности обработчика событий. Грязная проверка привязки каждого шаблона может быть не самым эффективным способом обнаружения изменений, но нам намного проще писать наши обработчики событий (например, писать наши приложения).
Почему Angular2 обнаруживает изменения во всех компонентах после любого асинхронного события (XHR)?
Угловой не хочет ограничивать то, что мы можем сделать в наших обработчиках событий. Обработчик событий, связанный в шаблоне ComponentA, может изменять данные, которые являются локальными для ComponentA, но он также может изменять данные, находящиеся в сервисе (и, следовательно, он может изменять данные, видимые для других компонентов), и он может изменять данные в других компонентах , например, путем вызова общедоступных API/методов для других компонентов.
Я думаю, что вы ищете 'ChangeDetectionStrategy: OnPush'? Также здесь очень подробная статья о changeetection в 2, если вам интересно (http://blog.thoughtram.io/angular/2016/02/22/angular-2-change-detection-explained.html) –
@MarkPieszak Спасибо вы за свой комментарий. Я много читал об обнаружении изменений в AJS 2. Я говорю о стратегии по умолчанию без каких-либо неизменных или наблюдаемых. – geeko
О, стратегия по умолчанию, да, они старались сохранить его похожим на Angular1, где вы хотите проверить все, поскольку событие async может изменить так много вещей на странице (компоненты/маршруты/данные/что у вас есть). Обычно Async всегда обновляет * что-то *, поэтому, если вы не укажете OnPush или что-то еще, они просто предполагают, что все должно быть проверено. Хотя обнаружение изменений происходит очень быстро, так что это не проблема, как в первом угловом! –