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 的评论中),OnPushAngular 只会检查组件的更改(即检查模板绑定)

  • 它的任何输入属性(不是“组件属性”)更改
  • 它触发一个事件(例如,单击按钮)
  • 一个可观察对象触发一个事件,并且async管道在视图中与该可观察对象一起使用

有关如何OnPush工作的更多信息,请参阅https://stackoverflow.com/a/36845604/215945

于 2016-04-25T16:22:30.417 回答
2

这不是一个错误。你犯了一个错误:

changeDetection: ng.core.ChangeDetectionStrategy.onPush

OnPush代替 onPush

Plunker 示例

于 2016-04-23T17:31:02.763 回答