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å:

  1. Endre row.bsaName eller bsaName-egenskapen på dataene dine til et objekt med {id, name} for å matche datamodellen til din [suggestions]
  2. Lag et array av strenger f.eks.: bsaNamesArr: string[] og når du henter dataene dine, map over data.result for å få navne-arrayet og tilordne det til bsaNamesArr this.bsaNamesArr=data.result.map(element => element.name). Nå, bruk bsaNamesArr som [suggestions] og bruk også bsaNamesArr i 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.

Relaterte artikler