2016-09-25 11 views
2

性能上の理由から、どこにでもChangeDetectionStrategy.OnPushを使用しようとする角度2のアプリケーションを作成しています。 FormBuilderで作成したフォームを表示している別のコンポーネントが含まれている、スムーズに動作するためには、OnPushを必要とする複雑なコンポーネントがあります。スライダをクリックすると、その内部値が更新されます(つまりform.value)が、スライダコンポーネントはこの新しい値を視覚化しない、つまり古い位置に固定されていることに気付きました。角度2のフォーム+ OnPush

これを修正する私の最初のアイデアは、リーフコンポーネントの変更検出戦略をDEFAULTに設定することでしたが、これは、親コンポーネントの変更検出戦略を変更する必要があるようには明らかに効果がありませんでした)。

は、その後、私はこのアイデアを思い付いた:

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

ngOnInit() { 
    INIT_FORM(); 

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

が、それは効果がありません。

OnPushを使用するコンポーネントの内部で角度2のフォームを動作させる可能性はありますか?

+0

あなたは確か '持っOnPush'されるコンポーネントによって使用される' @ Input'sの少なくとも一つのことを確認する必要があります関連する変更が発生するたびに新しい参照が表示されます。 'OnPush'を使うためのアプリケーション全体を作る上での良いガイドが見つかりました[ここ](https://vsavkin.com/managing-state-in-angular-2-applications-caf78d123d02#.1z6lg1hlu) – cvsguimaraes

答えて

1

自分自身をテストしたが、手動で変更の検出を起動すると、あなたがやりたいかもしれない:

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

ngOnInit() { 
    INIT_FORM(); 

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

ありがとう答えは、残念ながら、これは問題を解決しない、スライダはまだ立ち往生しています。あなたは他の考えを持っていますか? – highwaychile

+0

再生するプランカーが助けになるかもしれない –

+0

私はプランカーを作成しました:http://plnkr.co/edit/oVIoDua2olC6i56rzDcw?p=preview – highwaychile