倒计时组件:如何防止Angular2中的重新渲染?

伊戈鲁迪

我有一个Angular2主组件,其中包括许多子组件和一个独立的倒计时组件(在下面的代码中称为“ clock”)。倒数组件每秒钟更改一次标签,这导致主组件和所有其他组件(不必要地)重新呈现。我该如何预防呢?这是我的倒计时组件的来源:

import {Component, Input} from 'angular2/core';
@Component({
    selector: 'clock',
    template: `
        <span>
            {{caption}}
        </span>
    `
})
export class ClockComponent {
    public caption;
    @Input('seconds') seconds :number = 0;
    constructor() {
      var self = this;
      setInterval(function(){
            self.seconds--;
            self.caption = self.getCaption(self.seconds);
      }, 1000);
      this.caption = this.getCaption(this.seconds);
    }

    getCaption (seconds): string {
        let h = Math.floor(seconds / (60*60));
        let m = Math.floor((seconds - 60 * 60 * h) / 60);
        let s = seconds % 60;
        return ((h < 10) ? '0' : '') + h + ':'
             + ((m < 10) ? '0' : '') + m + ':'
             + ((s < 10) ? '0' : '') + s ;
    }
}

您可以想象它与其他人一起嵌入“ my-app”中;就像是:

<clock [seconds]="1800"></clock>
<other-comps>...</other-comps>...

编辑(每条评论):当我指的是重新渲染时,会发生这种情况:我在各种渲染操作上将console.log打印输出添加到其他组件(导航和问题,请参见下图),例如,一个组件具有一个类绑定器,例如:[class.selected] =“ isSelected”,我已经将console.log()添加到isSelected()方法中,因此可以发现每次倒数(时钟)每秒钟调用一次刷新自己。我希望倒计时可以更改标签(例如从30分钟开始倒计时),而又不影响导航和问题组件并使它们重新呈现。

主组件和子组件

编辑(2):

这是the人:http ://plnkr.co/edit/PwBfUQXyZyTrqPaqrwRm?p=preview

启动控制台,并注意六个“ q-nav isSelected?”。每秒出现一次(从qnav组件打印)。

贡特·佐赫鲍尔(GünterZöchbauer)

这是在每个事件上调用的Angular的更改检测,而setInterval调用回调就是这样的事件。

您可以将变更检测切换为,OnPush以便变更检测仅在@Input()更新或显式调用变更检测时才发生,例如,通过调用on上的方法ChangeDetectorRefs

import {Component, Input, OnInit, EventEmitter, Output, OnChanges, ChangeDetectionStrategy} from 'angular2/core';
@Component({
    selector: 'q-nav',
    template: `
        <span *ngFor="#a of currAnswers; #i = index" class="aii-qn"
            [class.selected]="isSelected(i)"
            (click)="onSelect(i)">
            <span class="badge">{{ i+1 }}</span>
        </span>
    `,
    styles: [`
        .aii-qn {
            color: #0000ff;
            cursor: pointer;
            font-size: 2rem;
        }
        .selected {
            border: black solid 2px;
        }

    `],
    changeDetection: ChangeDetectionStrategy.OnPush
})

有关更多详细信息,请参见:http :
//blog.thoughtram.io/angular/2016/02/22/angular-2-change-detection-explained.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章