【问题标题】:p-autoComplete Pre-select a default valuep-autoComplete 预选默认值
【发布时间】:2018-11-25 15:24:52
【问题描述】:

我在表格中使用 p-autoComplete,一旦选择了一行,我的自动完成应该预先选择当前值。我尝试使用 [(ngModel)]="row.bsaName" 但它不起作用。 (单击下拉菜单后,我会看到所有值,我确认这些值确实存在于我的 p-autoComplete 下拉列表中)

还请注意,我使用了 p-calendar,一旦单击编辑,我就可以预先选择当前日期,但不确定为什么自动完成不同

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>

组件

    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'));

    }

界面

export interface IBsaList {

    id: string,
    name: string
}

************************************************更新** ************************************************ 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>

组件

        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'));

    }

【问题讨论】:

  • 问题是row.bsaName 可能是stringautoComplete 填充有Array of Object 并且您指定该字段为name。因此绑定不起作用。
  • 更新了我上面的代码......它是一个字符串数组......那么我将如何完成它
  • 您能否将您的IBsaList 映射到string[]。类似于:this.bsaNameArr = this.iBsaList.map(bsa =&gt; bsa.name) 然后使用 bsaNameArr 作为自动完成的 [suggestions]
  • 还是不行..更新了我上面的代码
  • data.result 返回什么?

标签: angular typescript primeng primeng-datatable primeng-dropdowns


【解决方案1】:

你可以使用,

 <ng-template></ng-template>

里面

 <p-autoComplete></p-autoComplete>

标签,就像我在我的项目中所做的那样。语法如下:

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

如果您想从选定的建议中选择 2 个值,我们可以使用它。

【讨论】:

    【解决方案2】:

    只是为了调和cmets中发生的一切。

    autocomplete 无法按预期工作的原因是因为您将 [(ngModel)] 绑定到 字符串 row.bsaName 而您的 [suggestions] 是一个 对象数组。因此,绑定在这里不起作用。有几种方法可以解决此问题:

    1. 将数据上的row.bsaNamebsaName 属性更改为带有{id, name} 的对象,以匹配[suggestions] 的数据模型
    2. 制作一个字符串数组,例如:bsaNamesArr: string[] 并在您的数据提取中,map 在您的data.result 上获取name array 并将其分配给bsaNamesArr this.bsaNamesArr = data.result.map(element =&gt; element.name) .现在,将bsaNamesArr 用作[suggestions],并在您的(completeMethod) 中也使用bsaNamesArr

    如果您使用第二种方法,请确保删除 p-autocomplete 上的 field 属性。

    祝你好运!

    【讨论】:

    • 最后一个问题....如何从我的自动完成下拉列表中获取选定的 ID 而不是名称。我确实有一个功能,即选定的行,它正在工作,但我如何获得选定的 id 而不是名称 frm 自动完成 onFollowupSave(row) { console.log("BSA UID " + this.bsaNameArr[row]); }
    • 如果您想显示名称并在选中时获取 id,我建议您使用第一种方法同时访问 id 和名称。但是,您可以使用 Array.find() 方法从 selectedName 中获取 id。
    • 好的,为简单起见,我需要使用选项 1,因为我有更多基于选择的逻辑。如果我选​​择选项 1,我将如何绑定?提前原谅我的无知:)
    • @rgoal - 在映射到简单的字符串数组之前,您始终可以过滤数组。 array.filter(a =&gt; a.prop1 == "condition1").map(element =&gt; element.prop1)
    猜你喜欢
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 2022-06-27
    • 2020-07-27
    • 1970-01-01
    相关资源
    最近更新 更多