#angular #angular2-template
#angular #angular2-template
Вопрос:
У меня есть этот шаблон компонента
<!-- Some initial page code -->
<sm-modal title="Create new movement" icon="exchange" #editStorageModal>
<modal-content>
<form class="ui form error" (ngSubmit)="saveEdit()" #editStorageModalForm="ngForm">
<!-- Other stuff -->
<table class="ui celled table">
<thead>
<tr>
<th>Product</th>
<th>Amount changed (negative for removals)</th>
<th></th>
</tr>
</thead>
<tbody>
<tr *ngFor="let movement of currentStorageMovement.storage_product_movements; let i = index; trackBy:customTrackBy">
<td>
<sm-select [(model)]="movement.product_id" placeholder="Select product..." class="fluid search" [ngClass]="{loading: loadingProducts}">
<option *ngFor="let product of products" value="{{product.id}}">{{product.name}} - {{product.supplier?.name}}</option>
</sm-select>
</td>
<td>
<div class="field" [ngClass]="{error: formErrors.storage_product_movements amp;amp; formErrors.storage_product_movements[i]?.amount}">
<input type="number" step="1" placeholder="Amount" [(ngModel)]="movement.amount" name="amount">
</div>
</td>
<td>
<a class="clickable" (click)="deleteProductMovement(i)"><i class="trash icon"></i></a>
</td>
</tr>
<tr *ngIf="(!storageMovements || !storageMovements.length) amp;amp; !loading"><td colspan="3" class="center aligned">No storage movements yet...</td></tr>
<tr *ngIf="loading"><td colspan="3"><div class="ui active centered inline loader"></div></td></tr>
</tbody>
</table>
<div class="ui button primary" (click)="addNewProductMovement()">New product movement</div>
</form>
</modal-content>
<modal-actions>
<div class="ui button red" (click)="closeEdit()">Abort</div>
<div class="ui button green" (click)="editStorageModalForm.ngSubmit.emit()" [ngClass]="{loading: submitting}">Save</div>
</modal-actions>
</sm-modal>
когда у меня есть 2 элемента в currentStorageMovement.storage_product_movements
одном с amount 2
, а в другом с amount 3
, angular отображает 2 входных данных, оба из которых имеют 3
значение.
Используя Augury, я могу видеть, что элементы массива правильно имеют значения 2 и 3, вместо этого входной элемент с 3 (тот, который должен быть 2) обладает этими свойствами:
NgModel
value: 3
viewModel: 2
итак, каким-то образом ngModel знает значение, но отображает что-то еще во входном значении
Для справки, модальный код этот
Обновление: после клонирования того же шаблона вне модального я вижу, что ввод вне модального правильный, а тот, что внутри, неправильный, может быть потому, что модальный использует jquery для перемещения dom из моего шаблона за пределы элемента app dom, чтобы иметь правильный стиль / позиционирование?
Комментарии:
1. Каждый из
input
элементов имеет один и тот жеname
атрибут, который обычно считается уникальным. Может быть, это все портит?2. Ты мужчина, если хочешь, объясни это в ответе, показывающем способ присвоения уникального имени на основе индекса, и я отмечу как принятый ответ
Ответ №1:
Каждый из входных элементов имеет один и тот же атрибут name, который должен быть уникальным. Чтобы присвоить каждому элементу ввода уникальное имя, вы можете использовать {{ }}
выражение в его значении с i
как часть выражения. Например {{ "amount" i }}
.
Комментарии:
1. Спасибо за этот действительно полезный ответ! 🙂 Пример: Вы могли бы поместить «let i = index» в цикл ngFor. Затем обратитесь к {{i}} в вашем html-коде.