gpt4 book ai didi

Angular2 - ngFor 指令不映射已删除的项目

转载 作者:太空狗 更新时间:2023-10-29 17:30:02 25 4
gpt4 key购买 nike

我有一个项目容器和项目模式,应该在其中添加子项目和从其容器中删除子项目。添加很好,而删除什么都不做。删除任何子项时,angular2 *ngFor 指令似乎不起作用。

    import { NgFor} from 'angular2/common';
import { bootstrap } from 'angular2/platform/browser';
import { Component, View, Directive, OnDestroy, Input, enableProdMode } from 'angular2/core';
import { CORE_DIRECTIVES} from 'angular2/common';


@Component({selector: 'itemcontainer',})
@View({ template: `<ul (click)="$event.preventDefault()">
<li *ngFor="#it of items">Any Item</li>
</ul>
<div><ng-content></ng-content></div>`,

directives: [NgFor],
})
export class ItemContainer {
public items: Array<Item> = [];

public addItem(item: Item) {
this.items.push(item);
}

public removeItem(item: Item) {
var index = this.items.indexOf(item);
if (index === -1) {
return;
}

console.log(`Index about to remove: ${index} this.items length: ${this.items.length}`);
this.items.slice(index, 1);
console.log(`this.items length: ${this.items.length}`);
}
}

@Directive({ selector: 'item' })
export class Item implements OnDestroy {

@Input() public heading: string;

constructor(public itemcontainer: ItemContainer) {
this.itemcontainer.addItem(this);
}

ngOnDestroy() {
this.itemcontainer.removeItem(this);
}
}

@Component({
selector: 'my-app'
})
@View({
template: `<div (click)="$event.preventDefault()">
<button type="button" (click)="addItem()">Add item</button>
<button type="button" (click)="removeItem()">Remove item</button>

<itemcontainer>
<item *ngFor="#containerItem of containerItems" [heading]="containerItem.title">Content </item>
</itemcontainer>
</div>`,

directives: [CORE_DIRECTIVES, Item, ItemContainer],

})

class Tester {

private counter: number = 2;

public containerItems: Array<any> = [
{ title: 'Item1' },
{ title: 'Item2' },
];

addItem() {
this.containerItems.push({ title: `Item ${this.counter}` });
}

removeItem() {

if (this.containerItems.length > 0) {
this.containerItems.splice(this.containerItems.length - 1, 1);
}
}
}

enableProdMode();
bootstrap(Tester);

这是添加和删除两个新项目后的 DOM 样子:

    <itemcontainer>
<ul>
<li>Any Item</li>
<li>Any Item</li>
<li>Any Item</li>
<li>Any Item</li>
</ul>
<div>
<item>Content </item>
<item>Content </item>
</div>
</itemcontainer>

问题是 li 部分没有被删除。有什么想法吗?

(我用 angular 2.0.0-beta.3 和 2 测试了它。)

最佳答案

您需要使用 splice() 而不是 slice()。此处 Angular 变化检测没有问题。

this.items.splice(index, 1);

NgFor 将遍历您的数组项,它会检测何时添加或删除某些内容。

Plunker

此外,您可以删除这些内容:

import { NgFor} from 'angular2/common';
import { CORE_DIRECTIVES} from 'angular2/common';

directives: [NgFor],

此外,您的数据中有循环引用。将您的代码更改为以下内容

<li *ngFor="#it of items">Any Item {{it | json}}</li>

并注意控制台中的错误:

EXCEPTION: TypeError: Converting circular structure to JSON in [Any Item {{it | json}} in ItemContainer

关于Angular2 - ngFor 指令不映射已删除的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35362887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com