Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(core): replace assertion with more intentional error #52234

Closed
wants to merge 1 commit into from

Commits on Oct 27, 2023

  1. fix(core): replace assertion with more intentional error

    Issue angular#50320 shows that in some cases, updating a signal that's a dependency
    of a template during change detection of that template can have several
    adverse effects. This can happen, for example, if the signal is set during
    the lifecycle hook of a directive within the same template that reads the
    signal.
    
    This can cause a few things to happen:
    
    * Straightforwardly, it can cause `ExpressionChanged` errors.
    * Surprisingly, it can cause an assertion within the `ReactiveLViewConsumer`
      to fail.
    * Very surprisingly, it can cause change detection for an `OnPush` component
      to stop working.
    
    The root cause of these later behaviors is subtle, and is ultimately a
    desync between the reactive graph and the view tree's notion of "dirty" for
    a given view. This will be fixed with further work planned for change
    detection to handle such updates directly. Until then, this commit improves
    the DX through two changes:
    
    1. The mechanism of "committing" `ReactiveLViewConsumer`s to a view is
       changed to use the `consumerOnSignalRead` hook from the reactive graph.
       This prevents the situation which required the assertion in the first
       place.
    
    2. A `console.warn` warning is added when a view is marked dirty via a
       signal while it's still executing.
    
    The warning informs users that they're pushing data against the direction of
    change detection, risking `ExpressionChanged` or other issues. It's a
    warning and not an error because the check is overly broad and captures
    situations where the application would not actually break as a result, such
    as if a `computed` marked the template dirty but still returned the same
    value.
    alxhub committed Oct 27, 2023
    Configuration menu
    Copy the full SHA
    eb6d840 View commit details
    Browse the repository at this point in the history