【问题标题】:Decrement Index of *ngFor in AngularAngular 中 *ngFor 的递减索引
【发布时间】:2017-11-24 12:26:35
【问题描述】:

使用 Angular 4.0.2,我有一个 *ngFor 创建输入元素并通过添加按钮更新对象数组,但我试图弄清楚一旦从该数组中删除项目后如何更新对象的索引.

目前,我的 ngFor 看起来像:

*ngFor = let name of names; let i = index

然后,我的删除按钮有一个(点击)事件:

(click)="removeRow(i, names)"

方法如下:

    removeRow(index:number, names:Names[]){
        names.splice(index,1);
        index--;
    }

但是,当我在删除一个对象后去更新数组中的另一个输入元素时,索引不正确。 *ngFor 中的 "let i = index" 似乎没有递减,我显然不能只使用:

(click)="removeRow(i, names); i--"

【问题讨论】:

  • 你不需要自己减少索引,如果你从集合中删除一个项目 ngFor 将显示更新的项目和一个新的索引。为什么要将'names'作为参数发送给remove函数,你已经在类中了?

标签: javascript arrays angular ngfor decrement


【解决方案1】:

没有看到更多你的代码......这只是一个猜测。但我假设你也有组件类的 names 属性?

尝试将名称数组传递给方法,而只是从绑定的名称属性中删除元素。然后 Angular 的数据绑定应该负责其余的工作。

模板:

<tr *ngFor='let product of products; let i = index'>
    <td>
        <img    [src]='product.imageUrl'
                [title]='product.productName | uppercase'
                (click)="removeRow(i)">
    </td>
</tr>

我有一张图片,所以使用了点击它......但它在按钮上的效果是一样的。

组件类:

removeRow(index: number): void {
    this.products.splice(index,1);
}

此外,我使用 {{i}} 在模板中显示了“i”的值,删除一行后,“i”值 已针对新的索引集进行了正确调整。

【讨论】:

  • 你的建议和上面的 snaplemouton 一样吗?如果是这样,不幸的是,这对我没有用。
  • 你能拼凑出一个 plunker 来演示这个问题吗?
  • 会做-谢谢!看起来 plunker 目前已关闭,但稍后会检查。
  • 好的,我刚刚将此代码添加到我的一个示例项目中,它工作得很好,就像我上面描述的那样。我将使用代码的关键部分更新我的答案。
  • 是的,当我回复时,我没有看到已经有相同答案的回复...
【解决方案2】:

i 不是按值传递到您的删除行函数中吗?如果是这样,您必须在它存在的相同范围内减少它(在 ngFor 循环内)。

示例:https://snook.ca/archives/javascript/javascript_pass

【讨论】:

    【解决方案3】:

    您不需要手动修改 *ngFor 设置的索引。 Angular 用它的双向数据绑定来处理它。当您在组件中修改“名称”数组时,视图将自行更新以反映更改,这包括 *ngFor 上的索引。

    *ngFor:

    *ngFor="let name of names; let i = index"
    

    点击事件:

    (click)="removeRow(i)"
    

    组件方法:

    removeRow(index:number){
        this.names.splice(index,1);
    }
    

    请注意,您不需要将数组从视图传递到组件,因为您已经在组件中拥有它。

    编辑:Plunker

    【讨论】:

    • 我已经尝试过了,虽然更新了名称对象的索引,但 ngFor 中使用的索引却没有。基本上,如果我在对象数组中有两个项目,并在索引 0 处删除,然后通过 'update(i)' 方法更新剩余的对象,它会尝试在索引 = 1 处更新,而不是现在在索引处= 0,因此返回一个未定义的错误。
    • 当我在本地测试它时,它对我来说工作正常,plnkr 在 atm 下,所以在它备份之前我无法提供一个。
    • 添加了指向答案的 plunker 链接
    猜你喜欢
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 2019-05-11
    • 2017-03-13
    • 2018-08-13
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    相关资源
    最近更新 更多