انگولار - p-dropdown برچسب صحیح را نمایش نمیدهد وقتی متغیر ngModel یک شیء باشد


من از کامپوننت p-dropdown در PrimeNG استفاده میکنم. وقتی صفحه ابتدا بارگذاری میشود، من مقدار ng-model را تنظیم میکنم اما لیست کشویی همیشه اولین عنصر را به عنوان عنصر انتخاب شده نشان میدهد.

اچتیامال

<p-dropdown [options]="cities" [(ngModel)]="selectedCity"  optionLabel="name" [showClear]="true"></p-dropdown>
<p>Selected City: {{selectedCity ? selectedCity.name : 'none'}}</p>

TS

this.cities = [
            {label:'New York', value:{id:1, name: 'New York', code: 'NY'}},
            {label:'Rome', value:{id:2, name: 'Rome', code: 'RM'}},
            {label:'London', value:{id:3, name: 'London', code: 'LDN'}},
            {label:'Istanbul', value:{id:4, name: 'Istanbul', code: 'IST'}},
            {label:'Paris', value:{id:5, name: 'Paris', code: 'PRS'}}
        ];

اینجا نیویورک به عنوان مورد انتخابشده در منوی کشویی نمایش داده میشود حتی اگر من ng-model را به شهری دیگر تغییر دهم.

پاسخ شماره ۱

فکر میکنم مشکل شما در optionLabel="name" است زیرا شیء شهر شما شامل کلید name نمیباشد.

یا آن را با optionLabel="label" جایگزین کنید یا شیء شهر خود را از

{label:'New York', value:{id:1, name: 'New York', code: 'NY'}}

به

{name:'New York', value:{id:1, name: 'New York', code: 'NY'}}

StackBlitz را ببینید

پاسخ شماره ۲

من از یک سرویس برای وارد کردن گزینهها از بخش پشتی خود استفاده کردم (نسخه ناقص):

<p-dropdown
  class="mt-2"
  [options]="this.groupOptions"
  [(ngModel)]="this.selectedOption"
  [loading]="isLoading"
  placeholder="Choose a usergroup to activate" />

متغیر groupOptions در سازنده مقداردهی اولیه شد:

constructor(private _backendService: SomeControllerService) {
    this._backendService.getAllUserGroups().subscribe(groups => {
      this.groupOptions = [];
      groups.forEach(g =>
        this.groupOptions!.push({
          label: g.name??"Error",
          value: g.id??-1
        }));
    });
}

مشکل این است که دادهها خیلی دیر بارگذاری میشوند و primeng نمیتواند منوی کشویی را به درستی بسازد. سپس من این دایرکتیو ساده را در API پرایمانجی پیدا کردم که مشکل من را مثل جادو حل کرد (بارگذاری).

نسخه ثابت:

 <p-dropdown
  class="mt-2"
  [options]="this.groupOptions"
  [(ngModel)]="this.selectedOption"
  [loading]="isLoading"
  placeholder="Choose a usergroup to activate" />

فقط نیاز است متغیر را بهروزرسانی کنید:

isLoading: boolean = true;    
constructor(private _backendService: SomeControllerService) {
    this._backendService.getAllUserGroups().subscribe(groups => {
      this.groupOptions = [];
      groups.forEach(g =>
        this.groupOptions!.push({
          label: g.name??"Error",
          value: g.id??-1
        }));
    isLoading: boolean = false;
    });
}