【问题标题】:Angular: how to iterate over Immutable js Map inside the template?Angular:如何在模板内迭代不可变 js Map?
【发布时间】:2021-02-05 15:47:55
【问题描述】:

我想在我的 Angular 应用程序中使用 Immutable.js,因为我听说它可以提高性能。

所以我想将我的代码转换为使用 Immutable.js 包。

所以,我的组件有一个常规的打字稿地图,它在组件的模板中使用。 它使用带有 keyValue 管道的 *ngFor 进行迭代。

当我将该映射替换为 Immutable.Map 时,迭代将不起作用!!

那么问题来了,如何在模板中迭代 Immutable.Map?

提前谢谢

更新: 重现问题。

在 app.component.ts 中:

import { Comoonent}  from '@angular/core';
import { Map as immuMap} from 'immutable' ;

@Component({
selector: 'app-map', 
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'] 
}) 
export class AppComponent {
myMap = immuMap({ a: 1, b: 2, c:3});
}

在 app.component.html 中:

<div *ngFor="let item of myMap |  keyvalue >
     <span>{{item.key}} :  {{item.value}}</span>
</div>

当 myMap 是一个简单的 typescript Map 时,它可以工作。 上面的代码是重构为 Immutable.js Map 之后的代码。 现在 ngFor 不会产生与以前相同的结果....

顺便说一句,上面代码的结果是: __改变:假 __哈希: __ownerID: _root : [对象对象] 尺寸:3

【问题讨论】:

  • 请帮助响应者通过添加代码和描述问题来重现您的问题(“无法工作”不是问题描述)(How to ask a good question)。所有 immutable.js 集合都支持可迭代模式,因此这可能是您的代码特有的问题。
  • @dube 感谢您的评论! “在 Angular 中迭代……”没有回答我的问题。因为他使用 List 而我使用 Map。我更新了问题。

标签: angular typescript immutable.js


【解决方案1】:

由于不可变集合已经是可迭代的,您可以删除键值管道。ngFor 可以将 immutable.js Map 完全视为原生 javascript Map。

Map 的iterator 的条目是数组,格式为[key, value]

const imMap = Immutable.Map({ a: 1, b: 2, c:3});
for(entry of imMap ) {
  console.log('entry', entry[0], 'is', entry[1]);
}

const nativeMap = new window.Map([['a',1], ['b',2], ['c':3]]);
for(entry of nativeMap ) {
  console.log('entry', entry[0], 'is', entry[1]);
}

// both loops will output:
// entry a is 1
// entry b is 2
// entry c is 3

【讨论】:

  • 感谢您的快速回答。但是,首先它不完全是我的意思。我希望解决方案在模板(html)中,而不是在打字稿中。因为我需要将 *ngFor 中的原始“键值”管道重构为其他做同样事情但在来自 Immutable.js 的 Map 上的东西。其次,从技术上讲,我将您的代码复制到了我的 Angular 项目中,但它没有编译它。
  • 如果该代码无法编译,则说明您没有使用 ES6 或缺少导入。这并不是一个 1:1 的复制和意大利面解决方案。但你是对的,它应该与 keyvalue 管道一起使用。我认为你的数据不是你想象的那样。例如。也许你有嵌套对象而不是那个简单的测试数据。也不清楚您的示例输出中的键和值是什么。原生 JS Map 和 Immutable.JS Map 的代码应该以相同的方式工作
猜你喜欢
  • 2012-01-10
  • 2018-09-02
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
相关资源
最近更新 更多