【问题标题】:PrimeNG auto-complete dropdown setup with AngularPrimeNG 使用 Angular 自动完成下拉设置
【发布时间】:2018-04-10 22:51:41
【问题描述】:

自动完成功能不起作用,第一次加载下拉列表,一旦我尝试输入某些内容没有过滤,那么下拉列表值就消失了 服务.ts

 getUserLocations(UserID: string, allList:string  ) {
        return this._http.get(environment.BASE_API_URL + 'xxxxx/' + ID + '/' + allList)
            .map((response: Response) => response.json())
              .do(data => console.log('locations ' + JSON.stringify(data)))
            .catch(this.handleError);
    }

组件.ts

        brand: any [];
        filteredBrands: any[];
       GetUserLocations(PNSLUID: string, allList: string) {
                   this._searchService.getUserLocations(ID, allList)
                .subscribe(
                data => {
                    this.brand= data.result.name;//not sure how to bind the id
                },
                error => console.log('GetControls Method: ' + <any>error, 'alert alert-danger'));
        }

   filterBrands(event) {
        this.filteredBrands = [];
        for (let i = 0; i < this.brand.length; i++) {
            let brand = this.brand[i];
            if (brand.toLowerCase().indexOf(event.query.toLowerCase()) == 0) {
                this.filteredBrands.push(brand);
            }
        }
    }

html

<p-autoComplete  [(ngModel)]="brand" [suggestions]="filteredBrands" (completeMethod)="filterBrands($event)" [size]="30"
                                                [minLength]="1" placeholder="Office" [dropdown]="true">
                                    <ng-template let-brand pTemplate="item">
                                        <div class="ui-helper-clearfix" style="border-bottom:1px solid #D5D5D5">

                                            <div style="font-size:18px;float:right;margin:10px 10px 0 0">{{brand}}</div>
                                        </div>
                                    </ng-template>
                                </p-autoComplete>

问题是它没有填充自动完成下拉列表..绑定有问题

**************************************************** **更新*********************************************** ****** 问题:示例:我的下拉列表具有以下值

  1. 区域a

  2. 区域 b

  3. 区域 c

  4. 乙肝办公室

  5. 迪办公室

如果我键入区域自动完成不起作用,它仍然会显示所有值,但是,如果我选择区域 b 然后开始删除 b 然后自动完成工作..换句话说..它只有在我选择一个值但如果我从空文本开始并开始输入它不起作用

html

 <p-autoComplete name="OfficeList" [(ngModel)]="val" [suggestions]="results" (completeMethod)="search($event)"  field="name" dataKey="id" [dropdown]="true"></p-autoComplete>

界面

export interface IOffices {
    id: number,
    name:string
}

组件

    val: IOffices;
    results: IOffices[];  
    originalResults: IOffices[];

 GetUserLocations(PNSLUID: string, allList: string) {
              this._searchService.getUserLocations(PNSLUID, allList)
            .subscribe(
              data => {
                  this.results = data.result;
                 this.originalResults = data.result; 
          },
          error => console.log('GetControls Method: ' + <any>error, 'alert alert-danger'));
            })
    }

search(event) {
            console.log("result 2 : " + this.originalResults.length.toString());
    console.log("event : " + event.query.toString());

    this.results = this.originalResults;

    this.results = this.results.filter(data => 
       data.name.indexOf(event.query) !== -1);

    }

【问题讨论】:

  • 您在哪里设置应该在 filteredBrands 变量中的品牌选项?
  • 更新了我上面的代码...问题是它没有填充下拉列表..绑定有问题
  • 我怀疑这是一个错字...for (let i = 0; i &lt; this.brand.length; i++) 在这一行中,您尝试使用实际存储API 返回的值
  • 我已经解决了这个问题,但是在将数据绑定到自动完成下拉菜单时仍然出现错误“如果在表单标签中使用 ngModel,则必须设置名称属性或表单控件必须在 ngModelOptions 中定义为“独立”。”
  • 我不知道你是否已经尝试过这个,但是从角度文档 " 定义名称属性是在将 [(ngModel)] 与表单结合使用时的要求。" angular.io/guide/forms,这很奇怪,因为自动完成文档甚至没有提到该属性,而是尝试一下。

标签: angular primeng primeng-datatable primeng-dropdowns


【解决方案1】:

似乎您正在使用primeng网站上发布的代码。请查看docs中的对象部分

此代码适用于字符串,如果我理解您的代码,您正在尝试绑定一个对象。

所以我的建议是:

  • 如果您要绑定对象,您应该使用autocomplete 中的属性field 来设置您想向用户显示的对象属性。

  • 您放入NgModel(您可以使用整个对象)中的变量应该与建议数组中的对象具有“相同的类型”。

  • 对于单击时的下拉功能,请使用 onDropdownClick 事件

HTML

<p-autoComplete name="OfficeList" [(ngModel)]="brand" [suggestions]="filteredBrands" (completeMethod)="filterBrands($event)" 
                 [size]="30" [minLength]="1" placeholder="Office" [dropdown]="true" (onDropdownClick)="GetUserLocations()">
 </p-autoComplete>

Component.ts

brand: any [];
filteredBrands: any[];

GetUserLocations(PNSLUID: string, allList: string) {
    this._searchService.getUserLocations(ID, allList)
        .subscribe(
            data => {
                this.results = data.result; // You should put the entire array of objects here
            },
            error => console.log('error'));
    }

search(event) {
        this.results = this.results
                           .filter(data => data..toString()
                           .toLowerCase()
                           .indexOf(event.query.toString().toLowerCase()) !== -1);
}

进行此调整应该可以工作。

一个工作示例: https://primeng-autocomplete-example.stackblitz.io/

希望对你有帮助。

【讨论】:

  • 感谢您的输入。仍然无法正常工作..我已经更新了上面的代码..我现在更接近解决方案
  • 更新了我的答案...from this.results = this.results.find(data => data.name.indexOf(event.query) !== -1);'''(this .results) 抛出错误
  • this.result 中的错误“严重代码描述项目文件行抑制状态错误 TS2322 类型“IOffices”不可分配给类型“IOffices[]”。类型“IOffices”中缺少属性“查找” '。
  • 我的错误而不是find 使用filter
  • 现在它将值绑定到下拉列表,这是向前迈出的一步,但自动完成不是......在浏览器上抛出错误“如果在表单标签中使用 ngModel,则名称必须设置属性或表单控件必须在 ngModelOptions 中定义为“独立”
猜你喜欢
  • 2022-11-11
  • 2017-10-29
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多