2016-09-25 6 views
2

Ich schreibe eine eckige 2-Anwendung, wo ich versuche, ChangeDetectionStrategy.OnPush aus Leistungsgründen überall zu verwenden. Ich habe eine komplexe Komponente, die OnPush benötigt, um reibungslos zu funktionieren, die eine andere Komponente enthält, die ein Formular anzeigt (erstellt mit FormBuilder). Ich habe jetzt bemerkt, dass, wenn ich auf einen Schieberegler klicke, der interne Wert davon aktualisiert wird (d. H. Form.value), aber die Schieberkomponente diesen neuen Wert nicht visualisiert, d. H. Sie bleibt an der alten Position hängen.Angular 2 Formen + OnPush

Meine erste Idee, dies zu beheben, war, die Änderungsdetektionsstrategie der Blattkomponente auf DEFAULT zu setzen, aber dies hatte keine Auswirkungen, da dies offensichtlich die Änderungserkennungsstrategie der übergeordneten Komponenten ändern muss (was in meiner Anwendung nicht möglich ist)).

Dann kam ich mit dieser Idee:

@Component({ 
    ... 
}) 
class MyComponent implements OnInit { 
    constructor(private zone: NgZone) {} 

ngOnInit() { 
    INIT_FORM(); 

    this.form.valueChanges 
    .subscribe(() => { 
     this.zone.run(() => {}); 
    }); 
    } 
} 

aber es hat keine Wirkung.

Gibt es eine Möglichkeit, kantige 2 Formen innerhalb einer Komponente, die OnPush verwendet, zu arbeiten?

+0

Sie müssen sicherstellen, dass mindestens einer der '@ Input's von Ihrer Komponente verwendet, die' ist OnPush' a haben neue Referenz bei jeder relevanten Änderung. Eine gute Anleitung, um die gesamte Anwendung zu 'OnPush' zu machen, finden Sie [hier] (https://vsavkin.com/managing-state-in-angular-2-applications-caf78d123d02#.1z6lg1hlu) – cvsguimaraes

Antwort

1

selbst nicht getestet, aber Aufruf Änderungserkennung kann manuell tun, was Sie wollen:

@Component({ 
    ... 
}) 
class MyComponent implements OnInit { 
    constructor(private cdRef: ChangeDetectorRef) {} 

ngOnInit() { 
    INIT_FORM(); 

    this.form.valueChanges 
    .subscribe(() => { 
     this.cdRef.detectChanges(); 
    }); 
    } 
} 
+0

Vielen Dank für Ihre antwort, aber leider löst das das problem nicht, der slider steckt immer noch fest. Hast du eine andere Idee? – highwaychile

+0

Ein Plunker zu reproduzieren könnte helfen –

+0

Ich habe einen Plünderer erstellt: http://plnkr.co/edit/oVIoDua2olC6i56rzDcw?p=preview – highwaychile

Verwandte Themen