簡體   English   中英

帶區域的Angular2變化檢測

[英]Angular2 Change Detection with Zones

我想知道是否可以通過將所有組件邏輯(包括組件內部的非組件指令的邏輯)包裝在區域中來將所有異步事件和回調追溯到特定的源組件,那么僅需要檢查源組件的變化假定所有更改都遵循單向流,則所有子組件的源輸入都會發生變化。

這種理解聲音嗎?

Angular2中是否提供此更改檢測策略?

為什么在發生任何異步(XHR)事件后Angular2會檢測所有組件上的更改?

一個完整的Angular應用程序在單個區域中運行。 Angular使用該區域修補異步API,並在每次發生某些異步事件時使用來自這些修補API的通知來運行更改檢測。

單向流適用於[prop]="value"綁定,該綁定僅在父級到子級之間起作用。

角行程從根到葉的變化檢測。

如果為組件配置了ChangeDetectionStrategy.OnPush ,則更改檢測將跳過這些組件(及其后代),直到某些綁定(輸入)已更改。

還有其他優化CD的策略。

  • 例如,可觀察和承諾,它們主動通知更改,而無需更改檢測。

  • 保證不改變其屬性值的不可變對象。

更新

Angular不知道事件處理程序已更改了什么值。 組件的屬性,全局服務的屬性,傳遞的對象引用的屬性....它只是假設當調用事件處理程序時,可能某些內容已更改,然后運行完整的更改檢測周期以傳播來自以下對象的所有綁定父母對孩子。

子代父綁定無論如何都是事件,因此在更改檢測期間不會更新。

...通過將所有組件邏輯(包括組件內部的非組件指令的邏輯)包裝在一個區域中,則只需要檢查源組件的更改以及源組件輸入已更改的所有子組件,並假設所有更改遵循單向流。 這種理解聲音嗎?

當觸發模板綁定事件時,例如(click)="doSomething()"doSomething()方法可以自由更改任何組件或應用程序數據。 根據Angular docs ,模板語句 (例如我們的doSomething()事件處理程序doSomething()不受單向流規則的約束:

響應事件是Angular的“單向數據流”的另一面。 在此事件循環過程中,我們可以隨時隨地更改任何內容。

這就是為什么默認情況下,在事件觸發后,Angular的更改檢測必須檢查每個組件中的每個模板綁定的原因。 (好吧,在Angular區域內發生事件之后。)Angular不知道可能發生了什么變化,它必須發現發生了什么變化。

單向流規則適用於模板表達式,例如{{some expression}}[childInputProperty]="parent expression"或者如果您實現輸入屬性設置器方法: @Input() set childInputProperty(variableName:type) { ... }

Angular2中是否提供此更改檢測策略?

不可以,因為它將嚴重限制事件處理程序的功能。 臟檢查每個模板綁定可能不是檢測更改的最有效方法,但是它使我們更容易編寫事件處理程序(即,編寫應用程序)。

為什么在發生任何異步(XHR)事件后Angular2會檢測所有組件上的更改?

Angular不想限制我們在事件處理程序中可以做什么。 綁定在ComponentA模板中的事件處理程序可以更改ComponentA本地的數據,但它也可以更改服務中的數據(因此它可以更改其他組件可見的數據),並且可以更改其他組件中的數據,例如,通過在其他組件上調用公共API /方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM