2

変更検出戦略が onPush に設定されている場合、コンポーネントの属性が変更された場合、コンポーネントのみを再レンダリングする必要があります。

コード例を次に示します。

        var SampleComponent1 = ng.core.Component({
            selector: "sampleone",
            template: "{{value}}",
            viewProviders: [ng.core.ChangeDetectorRef],
            changeDetection: ng.core.ChangeDetectionStrategy.onPush
        }).Class({
            constructor: [ng.core.ChangeDetectorRef, function(cd){
                this.cd = cd;
            }],
            ngOnInit: function(){
                this.value = 1;
                setInterval(function(){
                    this.value++;
                }.bind(this), 2000)
            }
        })

        var App = ng.core.Component({
            selector: "app",
            directives: [SampleComponent1],
            template: "<sampleone ></sampleone>"
        }).Class({
            constructor: function(){

            }
        })

ここで、属性が変わらなくてもテンプレートはレンダリングされますか? これはバグですか、それとも onPush を誤解していますか?

4

2 に答える 2

2

修正については@yurzuiの回答を参照してください。ただし、コメントしたかった

変更検出戦略が onPush に設定されている場合、コンポーネントの属性が変更された場合、コンポーネントのみを再レンダリングする必要があります。

それはもう少しです。Savkinのブログ投稿(まあ、@vivainio へのコメントに埋もれています) によるとOnPush、Angular は、次の場合にのみコンポーネントの変更をチェックします (つまり、テンプレート バインディングをチェックします)。

  • その入力プロパティ(「コンポーネント属性」ではない) の変更
  • イベントを発生させます (例: ボタンのクリック)
  • オブザーバブルがイベントを発生させ、asyncパイプがそのオブザーバブルのビューで使用されます

仕組みの詳細については、 https://stackoverflow.com/a/36845604/215945OnPushを参照してください。

于 2016-04-25T16:22:30.417 に答える
2

これはバグではありません。あなたはミスを犯しました:

changeDetection: ng.core.ChangeDetectionStrategy.onPush

onPush の代わりに OnPush

プランカーの例

于 2016-04-23T17:31:02.763 に答える