【问题标题】:Assigning list to dropdown inside subscribe method将列表分配给订阅方法内的下拉列表
【发布时间】:2019-06-06 19:53:01
【问题描述】:

我正在尝试使用订阅方法从数据库中获取的一些数据填充NgMultiSelectDropDown。要分配给下拉列表的列表正在 subscribe 方法中填充。

a = [];
ddlList = [];
public jsonString: string = "";
public insrdList: Array < InsuredData > = [];
public insrdList1: InsuredData[];
constructor(
  http: HttpClient,
  @Inject('BASE_URL') baseUrl: string,
  private _cmsService: CMSService) {
  http.get < WeatherForecast[] > (baseUrl +
    'api/SampleData/WeatherForecasts').subscribe(result => {
    this.forecasts = result;
  }, error => console.error(error));
  this._cmsService.getAllInsuredNames().subscribe(res => {
    var i = 0;
    for (var k in res) {
      i++;
      this.ddlList.push(
        {
          "item_id": i,
          "item_text": (res)[k].insuredName
        }
      };
    }
    this.a = this.ddlList;
  }, error => console.error(error));
}

我的问题是,当我尝试将dropdown 绑定到ddlList 时,它不起作用。但是,当我将它绑定到a 时,它就可以工作了。

<ng-multiselect-dropdown [placeholder]="'custom placeholder'" [data]="a" [(ngModel)]="selectedItems" [settings]="dropdownSettings" (onSelect)="onItemSelect($event)" (onSelectAll)="onSelectAll($event)">
</ng-multiselect-dropdown>  

为什么会这样?

【问题讨论】:

    标签: angular typescript angular6


    【解决方案1】:

    MultiSelectComponent 适用于ChangeDetectionStrategy.OnPush。它通过比较组件输入的引用来工作。在ddlList 的情况下,您没有更改对对象的引用(javascript 中的数组是对象),并且没有触发 OnPush 更改检测器。在a 的情况下,这部分更改了数组a 的引用:

    this.a = this.ddlList;
    

    【讨论】:

    • 知道了..那么有没有更好的方法来做到这一点?
    • 我会使用spread sintax。在这种情况下它很有用。 this.ddlList = [ ...this.ddlList, {"item_id": i, "item_text": (res)[k].insuredName} ]
    • 按照本文中的建议使用 ChangeDetectorRef 的 markForCheck 方法让它工作 - alligator.io/angular/change-detection-strategy
    猜你喜欢
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多