2016-06-28 4 views
1

Мне интересно, можно ли проследить все асинхронные события и обратные вызовы обратно к определенному исходному компоненту путем переноса всей логики компонента (включая логику некомпонированных директив внутри компонента) в зону, тогда только этот источник компонент должен быть проверен на изменения вместе с любыми дочерними компонентами с измененными входами исходного компонента, если все изменения следуют за однонаправленным потоком.Angular2 Обнаружение изменений с помощью зон

Это понимание звука?

Эта стратегия обнаружения изменений доступна в Angular2?

Почему Angular2 обнаруживает изменения во всех компонентах после любого асинхронного события (XHR)?

+0

Я думаю, что вы ищете 'ChangeDetectionStrategy: OnPush'? Также здесь очень подробная статья о changeetection в 2, если вам интересно (http://blog.thoughtram.io/angular/2016/02/22/angular-2-change-detection-explained.html) –

+0

@MarkPieszak Спасибо вы за свой комментарий. Я много читал об обнаружении изменений в AJS 2. Я говорю о стратегии по умолчанию без каких-либо неизменных или наблюдаемых. – geeko

+0

О, стратегия по умолчанию, да, они старались сохранить его похожим на Angular1, где вы хотите проверить все, поскольку событие async может изменить так много вещей на странице (компоненты/маршруты/данные/что у вас есть). Обычно Async всегда обновляет * что-то *, поэтому, если вы не укажете OnPush или что-то еще, они просто предполагают, что все должно быть проверено. Хотя обнаружение изменений происходит очень быстро, так что это не проблема, как в первом угловом! –

ответ

1

Одно целое Угловое приложение работает в одной зоне. Угловое использует зону для исправления асинхронных API и использует уведомления из этих исправленных API, чтобы запускать обнаружение изменений каждый раз, когда произошло какое-то асинхронное событие.

Однонаправленный поток для привязок [prop]="value", который работает только от родителя к ребенку.

Угловые пробеги изменяют обнаружение от корня до листьев.

Если ChangeDetectionStrategy.OnPush настроен для компонента, изменение обнаружения пропускает эти компоненты (и их потомки) до тех пор, пока не будут изменены некоторые привязки (входы).

Существуют и другие стратегии оптимизации компакт-диска.

  • Например, наблюдаемые и обещающие, которые активно сообщают об изменениях и не нуждаются в обнаружении изменений.

  • Неизменяемые объекты, которые не изменят свои значения.

Update

Угловая не знает, какие значения обработчик события изменился. Свойства компонента, глобальной службы, ссылок на объекты, которые были переданы, ... Он просто предполагает, что когда обработчик событий был вызван, возможно, что-то изменилось, а затем запускает полный цикл обнаружения изменений для распространения всех привязок из от родителя к ребенку.

Реальные дочерние привязки являются событиями в любом случае и поэтому не обновляются во время обнаружения изменений.

+1

Симпатично сказал Гюнтер! Следует отметить также, что три вещи, исправленные с помощью зон: 1) 'Таймеры' (таймауты и т. Д.) 2)' XHR' (ajax) 3) 'События' (клики и т. Д.). Любая из этих трех вещей может вызвать обнаружение изменений. (Тем, кто интересуется) –

+0

Спасибо. Я действительно спрашиваю, почему AngularJS не обертывает каждый компонент внутри отдельной зоны, чтобы асинхронные события можно было проследить до исходного компонента и, следовательно, можно оптимизировать стратегию обнаружения изменений по умолчанию, как я описал в своем вопросе? – geeko

+0

Я обновил свой ответ. –

1

... путем обертывания всей логики компонентов (включая логику некомпонентных директив внутри компонента) в зоне, тогда только этот компонент источника должен быть проверен на изменения вместе с любыми дочерними компонентами с измененными входами из исходный компонент, если все изменения следуют за однонаправленным потоком. Разве это понимание звучит?

Когда шаблон переплете срабатывает событие – например, (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/методов для других компонентов.

Смежные вопросы