angular - p-autoComplete Forhåndsvelg en standardverdi
Jeg bruker p-autoComplete i en tabell, når en rad er valgt, bør min auto complete forhåndsvelge den nåværende verdien. Jeg prøvde å bruke [(ngModel)]="row.bsaName", men det fungerer ikke. (Når jeg klikker på min rullegardin, ser jeg alle verdiene, jeg har bekreftet at verdiene finnes i min p-autoComplete-rullegardin)
Merk også at jeg brukte p-calendar, som jeg kunne forhåndsvelge gjeldende dato når jeg klikker på rediger, og jeg er ikke sikker på hvorfor autofullfør er annerledes
hTML
<p-table #dt [value]="iBsaFollowup" dataKey="id" [paginator]="true" [rowsPerPageOptions]="[10,50,100]"
[rows]="10">
<ng-template pTemplate="header">
<tr>
<th>ID</th>
<th>Followup DT</th>
<th>Comment</th>
<th>BSA Name</th>
<th>Action</th>
</tr>
</ng-template>
<ng-template pTemplate="body" let-row>
<tr>
<td>{{row.ID}}</td>
<td>
<div *ngIf="!row.isBSAEditable">{{row.followupDate}}</div>
<div *ngIf="row.isBSAEditable">
<p-calendar name="followupDate" [(ngModel)]="row.followupDate" [showIcon]="true"></p-calendar> <span style="margin-left:35px"></span>
<span *ngIf="isEmpty(row.comment)" style="color:crimson; font-size:8pt">Required</span>
</div>
</td>
<td>
<div *ngIf="!row.isBSAEditable">{{row.comment}}</div>
<div *ngIf="row.isBSAEditable">
<input type="text" [(ngModel)]="row.comment" style="width:95%" maxlength="200">
<span *ngIf="isEmpty(row.comment)" style="color:crimson; font-size:8pt">Required</span>
</div>
</td>
<td>
<div *ngIf="!row.isBSAEditable">{{row.bsaName}}</div>
<div *ngIf="row.isBSAEditable">
<p-autoComplete name="bsaNameList" [(ngModel)]="row.bsaName" [suggestions]="iBsaList" (completeMethod)="searchBsaList($event)" [style]="{'width':'85%'}" [inputStyle]="{'width':'85%'}" field="name" dataKey="id" [dropdown]="true"></p-autoComplete>
<span *ngIf="isEmpty(row.comment)" style="color:crimson; font-size:8pt">Required</span>
</div>
</td>
<td>
<div>
<modal [row]="row" [disableEditSaveButton]='isEmpty(row.comment)' (deleteRow)="onDeleteToDoList(row)" [showModal]="!row.isBSAEditable" (selectedRow)="onSelectedFollowupdRow(row)" (cancelEdit)="onCancelEdit(row)" (save)="onSave(row)"></modal>
</div>
<!--<button (click)="editRow(row)">Edit</button>-->
</td>
</tr>
</ng-template>
</p-table>
komponent
bsaListVal: IBsaList;
iBsaList: IBsaList[];
originalBsaList: IBsaList[];
searchBsaList(event) {
this.iBsaList = this.originalBsaList;
this.iBsaList = this.iBsaList
.filter(data => data.name.toString()
.toLowerCase()
.indexOf(event.query.toString().toLowerCase()) !== -1);
}
GetBsaList() {
this._dashboardService.getBSAList()
.subscribe(
data => {
this.iBsaList = data.result;
this.originalBsaList = data.result;
},
error => console.log('xx Method: ' + 'alert alert-danger'));
}
grensesnitt
export interface IBsaList {
id: string,
name: string
}
********************************************OPPDATERING********************************************** HTML
<p-autoComplete name="bsaNameList" [(ngModel)]="row.bsaName" [suggestions]="bsaNameArr" (completeMethod)="searchBsaList($event)" [style]="{'width':'85%'}" [inputStyle]="{'width':'85%'}" field="name" dataKey="id" [dropdown]="true"></p-autoComplete>
Komponent
bsaListVal: IBsaList;
iBsaList: IBsaList[];
originalBsaList: string[];
bsaNameArr: string[];
searchBsaList(event) {
this.bsaNameArr = this.originalBsaList;
this.bsaNameArr = this.bsaNameArr
.filter(data => data
.toLowerCase()
.indexOf(event.query.toString().toLowerCase()) !== -1);
}
GetBsaList() {
this._dashboardService.getBSAList()
.subscribe(
data => {
this.bsaNameArr = data.result.map(e => e.name);// data.result;
this.originalBsaList = data.result.map(e => e.name);
},
error => console.log('GetAllAccessFor Method: ' + 'alert alert-danger'));
}
Svar #1
Bare for å få alt til å stemme som skjedde i kommentarene.
Grunnen til at autocomplete ikke fungerer som forventet, er fordi du binder [(ngModel)] til en streng row.bsaName, mens dine [suggestions] er et array av objekter. Derfor fungerer ikke bindingen her. Det finnes et par måter å løse problemet på:
- Endre
row.bsaNameellerbsaName-egenskapen på dataene dine til et objekt med{id, name}for å matche datamodellen til din[suggestions] - Lag et array av strenger f.eks.:
bsaNamesArr: string[]og når du henter dataene dine,mapoverdata.resultfor å fånavne-arrayetog tilordne det tilbsaNamesArrthis.bsaNamesArr=data.result.map(element => element.name). Nå, brukbsaNamesArrsom[suggestions]og bruk ogsåbsaNamesArri din(completeMethod)også.
Sørg for å fjerne field-egenskapen på din p-autocomplete hvis du bruker den andre tilnærmingen.
Lykke til!
Svar #2
Du kan bruke,
<ng-template></ng-template>
innenfor
<p-autoComplete></p-autoComplete>
merk som jeg har gjort i prosjektet mitt. Syntaks nedenfor:
<p-autoComplete
pTooltip="'tooltip'"
[(ngModel)]="student"
#student_id="ngModel"
name="student_id"
[suggestions]="studentsList"
(completeMethod)="filterStudentsList($event)"
field="name"
[size]="30"
placeholder="Enter Student name"
[minLength]="1"
required
(onSelect)="onSelect($event)">
<ng-template let-student pTemplate="item">
{{ student.name }}
</ng-template>
<ng-template let-student pTemplate="selectedItem">
{{ student.id }} {{ student.student_name }}
</ng-template>
Slik at hvis du vil velge 2 verdier fra valgte forslag, kan vi gjøre det ved å bruke dette.
