代码之家  ›  专栏  ›  技术社区  ›  Perrier

ngfor inputs复制彼此的值

  •  0
  • Perrier  · 技术社区  · 7 年前

    我正在使用Angular5,希望创建一个用户可以用按钮插入新记录的表单。每个记录中都有许多控件,应该独立于其他记录进行更改。我做过很多次,但现在我得到了奇怪的结果。

    <form #newRequestForm="ngForm">
        <a class="list-group-item" *ngFor="let detail of currentRequest.details; let index$ = index">
        .
        .
        .
        <ng-select [items]="products" [searchFn]="searchProduct" (change)="productChanged($event, detail)">
            <ng-template ng-label-tmp let-item="item">
                {{item.code}} - {{item.name1}}
            </ng-template>
        </ng-select>
        <input class="form-control" name="productname1" type="text" [ngModel]="detail.product.name1" />
        <input class="form-control" name="productname2" type="text" [ngModel]="detail.product.name2" />
        <input class="form-control" name="productname3" type="text" [ngModel]="detail.product.name3" />
    
        <input class="form-control" type="text" name="description" [(ngModel)]="detail.description" />
    

    问题是由ng select onchange调用的方法 productChanged 设置当前所选产品的产品名称。(产品在ERP中有3个单独的名称字段。)当发生这种情况时,表单中所有记录的3个名称字段都将更改为当前所选产品的名称字段。无论我使用哪一个ng select,都已更改。所有其他领域都是分开工作的,例如:描述。

    所以我想这个bug在方法中,但是看起来是这样的:

    productChanged($event, detail) {
        detail.product = $event;
        console.log('-----------------------------------------');
        this.currentRequest.details.forEach((d, i) => {
            console.log(i, d.product !== null ? d.product.name1 : '');
        });
    }
    

    是的,我试过用旧的console.log进行调试,它说每个细节的内容都是完美的,根据该记录的最后一个选择ng select。

    输入控件仍然由我所做的任何选择重写。为什么?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Maryannah    7 年前

    因为你没有指定跟踪函数,所以角度不知道如何跟踪你的输入。

    <a class="list-group-item" *ngFor="let detail of currentRequest.details; let index$ = index; trackBy: customTB">
    
    customTB(index, item) { return index + '-' + item.product.name1; }    
    
    推荐文章