- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试将 async
管道与 *ngFor
一起使用,以显示异步获取的项目数组。
<ul>
<li *ngFor="let item of items | async; trackBy: trackPost">
{{item.text}}
</li>
</ul>
ngOnInit() {
// very simple http call; returns an array of [{id: 1, text: "something"}]
this.items = this.itemService.loadItems();
}
trackPost(index, item) { return item.id; }
这很好用。然后我想添加一个项目:
async addItem(text) {
await this.itemService.addItem({text});
// reload items after adding
this.items = this.itemService.loadItems();
}
这也有效,它会在添加后正确更新项目。
问题是它将重新加载整个数组,而不是仅仅附加项目。您可以通过动画注意到这一点(如果您为其中的项目设置动画)。我知道我可以自己处理订阅并使用数组,但我想知道是否有办法使用异步管道执行此操作。
有没有办法将新项目添加到现有的可观察对象中?如果做不到这一点,是否有办法让模板正确跟踪项目而不是将它们视为重新添加?
最佳答案
问题是您通过 this.items = this.itemService.loadItems();
重新分配了流。因此,您的 Observable items
不会发出新值,Angular 会使用您的 trackBy 函数跟踪这些值,而不是您更改 items
的引用,从而导致 angular 进行完全重新加载.
因此只需更改服务的 addItem
函数,通过 loadItems
将更新后的值发送到您之前获得的 Observable。之后你只需调用
addItem(text) {
this.itemService.addItem({text});
}
服务示例:
@Injectable()
export class Service {
private items: Array<string> = [];
private items$ = new Subject<Array<string>>();
loadItems(): Observable<Array<string>> {
return this.items$.asObservable();
}
addItem(text: string) {
this.items = [...this.items, text];
this.items$.next(this.items);
}
}
关于javascript - trackBy 与异步管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44805203/
我正在尝试将 async 管道与 *ngFor 一起使用,以显示异步获取的项目数组。 {{item.text}} ngOnInit() { // very simple h
我有一个 *ngFor用于 array 的指令对象,它们具有相当多的属性。 我要这个 *ngFor仅在更改其中三个属性时才更新,但根据 documentation在 TrackByFunction 上
我的组件有点像 {{user.emailId}}× trackBy 函数为 public
最近,当您没有在每个 *ngFor 上实现 trackBy 函数时,Angular styleguide-lint-extender“Codelyzer”会发出警告。我想知道为什么这会被视为一个问题。
当我阅读有关 ngFor 和 trackBy 的文档 ( https://angular.io/api/common/NgForOf ) 时,我以为我明白 Angular 只会在 trackBy 返回
我想通过传递属性名称来跟踪 ngFor 项目来创建一个唯一的 trackBy 指令,这是代码: import { NgForOf } from '@angular/common'; import {
我想用trackBy提高长列表的性能。此列表的数据在更改时应该是不可变的,并通过异步管道提供给模板。虽然我正在使用 trackBy功能,每次我发出新值时都会重新呈现整个列表。即使数组内的对象与相同的
我在我的 ngFor 中激活了 trackBy 并且我确认它被调用并且正在工作,但我仍然注意到 DOM 在我的浏览器中重新呈现,这导致行闪烁。这里发生了什么?在 Angular1 中,我可以在我的浏览
在 ngFor 中使用“trackBy: index”是不是一个好习惯? 例如: {{error}} 在所有 *ngFor 中每次都需要使用 trackBy 来提高性能,否则我们可以忽略它。 如果
trackBy 函数(例如在 ngFor 中)提供两个参数:index 和 item(来自被迭代的集合)。有没有办法将附加信息(作为参数?)传递给 trackBy 函数? 我的情况是,我可能会为我的组
我想使用 ngFor trackBy 索引。我找到了类似下面的方法 @Component({ selector: 'my-app', template: ` {{item
我真的不明白我应该从 trackBy 返回什么。根据我在网上看到的一些示例,我应该返回对象上某些属性的值。这样对吗?为什么要获取 index 作为参数? 例如,在下面的情况下: Component.c
我的印象是 trackBy 函数仅在尝试优化 *ngFor 的性能时使用,因此如果发生变化,DOM 不会待重建。 但是,最近,我遇到了一种情况,trackBy 实际上修复了错误的行为。 以此为例:ht
我有一个更大的项目,我有 4 个嵌套的 *ngFor。所以创作大约有 200 行,我认为分享不会有帮助,所以我会尽可能地解释它。问题 刷新对象后,元素被销毁并重新创建。这会导致性能问题(我只关心 0.
在 Angular 中,*ngFor 是否需要 trackBy 函数?看了几篇here , here , here , 和 here也就是说使用 trackBy 会提高性能并具有更好的内存管理。但我想
我想使用 cdk 拖放来重新排序 ngFor 列表,但是因为我不想在放置后为每个元素再次触发动画,所以我还想使用 trackby 问题是当我使用 trackby 时,拖动每次都会快速返回而不是停留在缩
这个问题在这里已经有了答案: function gets called several times (3 个回答) 2年前关闭。 我已经开始使用 trackBy对于一些 ngFor在我的应用程序中进行
我有一个项目,前端是通过@angular/cli: 1.1.3开发的。一切工作正常,直到我尝试在产品模式下编译项目(ng build -prod)。在我使用 *ngFor 指令和 trackBy to
我正在 Angular 2 中创建一个演示应用程序。但是在执行此操作时,我遇到了这个错误: core.umd.js:3491 EXCEPTION: Uncaught (in promise): Err
在下面的例子中: https://stackblitz.com/edit/track-by-reuse?file=src/app/app.component.ts 如果将列数从 4 更改为 3,则具有
我是一名优秀的程序员,十分优秀!