Welchen Leistungseinfluss hat eine Klasse / Schnittstelle mit vielen Feldern?

8

Ich habe eine Klasse (Schnittstelle) in meiner eckigen 4-App, die viele Felder hat. Beachten Sie, dass die Instanz dieser Klasse / Schnittstelle immutable ist (d. H. Die Mitglieder werden NIE verändert).

z. B.

%Vor%

Diese Schnittstelle wird über einen Dienst (Singleton / Anwendungsebene bereitgestellt) bereitgestellt, der die Klasse als Mitglied verfügbar macht. ZB

%Vor%

Der Service wird in viele Komponenten (fast alle Komponenten) und oft in die entsprechende Vorlage und oft auch in den ts -Teil der Komponente eingefügt. Z.B.

%Vor%

Jetzt meine Fragen:

  • Wird eine große Klasse (mit vielen Feldern) aufgrund der Änderungserkennung winkelig langsam?
  • Gibt es eine Möglichkeit, eine Klasse als "Ignoriere mich bei Änderungserkennung" zu markieren? (Etwas ähnliches wie ChangeDetectionStrategy.OnPush , aber anstatt dies für jede Komponente anzugeben, kann für die Klasse selbst oder für das Mitglied des Dienstes deklariert werden)

Bitte beachten Sie, dass ich die Change-Erkennungsstrategie aller meiner Komponenten nicht in OnPush ändern möchte.

    
OschtärEi 17.07.2017, 13:23
quelle

1 Antwort

4
  

Wird eine große Klasse (mit vielen Feldern) winkelig langsam wegen machen   die Änderungserkennung?

Nein. Die Erkennung von Winkeländerungen führt zwei Operationen aus, die Klasseneigenschaften lesen:

  • DOM aktualisiert die aktuelle Komponente
  • Eingabe Bindings Update von untergeordneten Komponenten / Direktiven

Für diese Operationen erzeugt der Angular Compiler zwei Funktionen:

  • updateRenderer - liest Felder, die in der Vorlage verwendet werden
  • updateDirectives - liest Felder, die in Eingabe-Binding-Ausdrücken angegeben sind

Diese Funktionen lesen nur bestimmte Eigenschaften aus dem Service. Für Ihr Beispiel

Value: {{service.field500}}

Die Funktion updateRenderer sieht in etwa so aus:

%Vor%

Diese Funktionen werden bei jeder Digest-Schleife aufgerufen. Aber wie Sie sehen können, wird nur die relevante Eigenschaft aus dem Service gelesen. Es spielt also keine Rolle, wie viele Eigenschaften auf dem Dienst vorhanden sind.

  

Gibt es eine Möglichkeit, eine Klasse als "Ignoriere mich bei Änderungserkennung" zu markieren?

Ich nehme an, Sie fragen nach einer einmaligen Bindung wie in AngularJS. Vielleicht wird es auch in Angular hinzugefügt. Ich werde das überwachen und die Antwort aktualisieren, wenn etwas auftaucht. Aber wie Sie wahrscheinlich wissen, können Sie die Änderungserkennung für die Komponente mit cd.detach/cd.attach deaktivieren / aktivieren. Sie können auf ein Signal vom Dienst warten und CD manuell ausführen, wenn Sie gebraucht werden.

Hier ist die Liste der Artikel, die Sie lesen könnten, um die Mechanismen der Änderungserkennung besser zu verstehen:

AngularInDepth.com 21.07.2017, 08:34
quelle