【发布时间】:2016-04-04 10:42:14
【问题描述】:
我有一个 Angular2 主组件,其中包括许多子组件和一个独立的倒计时组件(在下面的代码中称为“时钟”)。倒计时组件每秒都会更改它的标签,这会导致主组件和所有其他组件(不必要地)重新渲染。我怎样才能防止这种情况? 这是我的倒计时组件的来源:
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):
这里是 plunker:http://plnkr.co/edit/PwBfUQXyZyTrqPaqrwRm?p=preview
启动控制台并观察六个“q-nav isSelected?”每秒出现一次(从 qnav 组件打印)。
【问题讨论】:
-
您能补充更多信息吗?我在您的代码中没有看到任何关于
Countdown组件的信息。它们有什么关系。 “重新渲染”是什么意思? -
Angular 允许one-time binding expressions,这意味着将
::前缀添加到绑定表达式会导致Angular 只评估它们一次(当页面加载时),而不是重新评估它们时DOM 变化。 -
大卫,Angular 1 的 :: 表达式在 Angular 2 中不存在。另外,我想要相反的 - 我希望一个组件与其他组件“隔离”,以免影响它们.其他子组件应该相互影响。有没有办法将 HTML 注入主应用程序组件,但让 Angular 忽略它(尽管它会改变它的外观)。
-
“重新渲染”是什么意思?你能在 Plunker 中演示吗?
-
@GünterZöchbauer - 刚刚做了,请参阅“编辑 (2)”。