首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得角2/4来更新现有的DOM节点而不是deleting+creating节点?

如何获得角2/4来更新现有的DOM节点而不是deleting+creating节点?
EN

Stack Overflow用户
提问于 2017-09-16 03:42:46
回答 1查看 152关注 0票数 2

我的Range4应用程序有一个组件,它有一个refresh方法可以从我的web服务中提取一个大对象,如下所示:

DTO/模型类型:

代码语言:javascript
复制
class NuclearReactorStatus {

    public reactorName: string;
    public coolingRods: CoolingRodStatus[]; // array of 1024 elements
}

class CoolingRodStatus {
    public rodId      : number;
    public temperature: number;
    public status     : string;
}

NuclearReactorDisplayComponent内部

代码语言:javascript
复制
public reactorStatus: NuclearReactorStatus;

refresh(): void {

    this.http.get<NuclearReactorStatus>()
        .subscribe(
            status => {
                this.reactorStatus = status;
            },
            err => {
                console.error( err );
            }
        );
}

在我的nuclearreactordisplay.component.html里面

代码语言:javascript
复制
<h1>Reactor {{reactorStatus.reactorName}}</h1>

<h2>Cooling rods</h2>
<ol *ngIf="reactorStatus.coolingRods">
    <li *ngFor="let rod of reactorStatus.coolingRods"
        [data.rod-id]="rod.rodId"
        [data.rod-temperature]="rod.temperature"
        class="{{ rod.temperature < 100 ? "cool" : rod.temperature < 1000 ? "warm" : rod.temperature < 10000 ? "hot" : "jalapeno" }}"
    >
        <span>{{rod.rodId}}</span>
    </li>
</ol>

我通过将棒状<li>元素排列到一个网格中来对它们进行造型:

代码语言:javascript
复制
ol {
    display: flex;
    flex-wrap: wrap;
    list-style: none;
    width: calc( 32 * 16px ); // grid is 32 elements wide, 32x32 == 1024
}
li {
    display: block;
    width: 16px;
    height: 16px;

    transition: background-color 0.2s;
}
li span {
    display: none;
}

li.cool     { background-color: black; }
li.warm     { background-color: orange; }
li.hot      { background-color: yellow; }
li.jalapeno { background-color: red; }

注意我对transition: background-color的使用,这样棒子的背景色就会逐渐改变,而不是突然变化。

当我运行我的程序时,我注意到在每次数据刷新而不是使用现有的DOM和更新<ol>属性时,Angular实际上替换了<li>和所有子<li>元素--因此,我的background-color转换从未发生过--但更令人担忧的是,由于以这种方式操作DOM的代价,each在我的计算机上的CPU使用量急剧上升。

如何获得角度来重用它在模板中创建的<ol><li>元素,而不是在每次刷新周期中删除和重新创建它们?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-16 04:06:31

由于当数据列表很大时,trackBy可能会预先形成不好的格式,因此ngFor提供了一个您可以告诉角如何替换现有DOM元素的ngFor。参见详细信息这里

代码语言:javascript
复制
<ol *ngIf="reactorStatus.coolingRods">
  <li *ngFor="let rod of reactorStatus.coolingRods; trackBy: trackByFun"
    [data.rod-id]="rod.rodId"
    [data.rod-temperature]="rod.temperature" class="{{ rod.temperature < 100 ? "cool" : rod.temperature < 1000 ? "warm" : rod.temperature < 10000 ? "hot" : "jalapeno" }}">
    <span>{{rod.rodId}}</span>
  </li>
</ol>

TrackByFun:

代码语言:javascript
复制
// assume you want to regenerate DOM element when rodId changed.
trackByFun(index: number, rod) { 
  return rod.rodId;               
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46249811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档