【问题标题】:Update on datachange on Angular 6Angular 6 上的数据更改更新
【发布时间】:2019-03-30 00:13:50
【问题描述】:

当 15 个请求结束时,我有一个包含 15 个响应的数组。我想在向数组添加新响应时更新视图而不刷新页面。

    loadItem(res: DashboardInfo[]): void {
    this.item.push([]); // ERROR
    this.item.push([]); // WARNING
    this.item.push([]); // INFORMATION
    this.item.push([]); // OK
    let element;
    while ((element = res.pop())) {
        let index: number;
        if (element.level === "ERROR") index = 0;
        else if (element.level === "WARNING") index = 1;
        else if (element.level === "INFORMATION") index = 2;
        else index = 3;
        if (element.path !== undefined) {
            if (this.featuresFlag.visibleFeatures.includes(element.path)) {
                this.item[index].push(element);
                this.item = this.item.slice();
            }
        }

    }
}

【问题讨论】:

  • 你想用什么来更新视图?你说你不想刷新 DOM。 DOM 的哪一部分?你如何展示这个嵌套矩阵的东西?
  • @Zlatko 我想在不刷新仪表板的情况下更新仪表板上的卡片。我的意思是,如果我有 4 张卡片并且其中只有 3 张显示在仪表板上,那么当第四个请求结束时,我希望它显示在仪表板上而不刷新它
  • 那么它可以通过 trackBy 来实现,正如下面的答案所暗示的那样,或者 OnPush 更改检测策略,或者两者的组合。

标签: javascript arrays angular typescript view


【解决方案1】:

@pascalpuetz 有正确的答案。 不过,这里有一个更具体的例子:

如果卡片有这个接口:

interface Card {
  id: string; // a value that uniquely identifies a card
  type: 'error' | 'success' | 'warning';
  message: string;
  delay: number;
}

您可以通过 Card 对象的独特属性(例如 id)来跟踪它们。

trackCardsById(index: number, card: Card) {
  return card.id;
}
<div *ngFor="let card of cards; trackBy:trackCardsById " class="card" [ngClass]="card.type">
  {{card.message}}
</div>

或者您可以通过它们在列表中的位置来跟踪它们:

trackCardsByIndex(index: number, card: Card) {
  return index;
}
<div *ngFor="let card of cards; trackBy:trackCardsByIndex " class="card" [ngClass]="card.type">
  {{card.message}}
</div>

您可以看到一个工作示例here

【讨论】:

  • 感谢您的回答@toskv。实际上,它适用于需要几秒钟才能获取与其相关信息的卡片。但是,我有一张卡片可能需要 1 分钟以上,而这张卡片只有在我刷新页面时才会显示。我的意思是,它不是动态添加到仪表板的:/
  • 无论计时器是什么,它都应该工作相同。也许正在发生其他事情。您确定请求已解决吗?我会尝试调试代码并尝试看看会发生什么。
  • Yuup,当我在浏览器中检查调用时请求已解决(1 分钟后返回代码 200),但它永远不会动态显示,我必须刷新页面才能看到卡片.我会调试以了解发生了什么,谢谢
【解决方案2】:

在您的模板上使用 *ngFor trackBy 属性。

<div *ngFor="let i of items; trackBy: trackByFn"></div>

在你的 component.ts 上

trackByFn(index, item) {
  return index; // or item.id
}

你可以在这里找到一个很好的例子:https://netbasal.com/angular-2-improve-performance-with-trackby-cc147b5104e5

【讨论】:

  • Trackby 1 件时更容易使用,但我这里有一张卡要退回,所以我真的不知道如何处理这个
  • 您的项目应该是“卡片”类型,或者您的卡片的代表数据结构是什么。 TrackBy 然后用于通过特定属性(例如 id)识别您的卡
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多