【问题标题】:Dynamically changing options for dropdown PrimeNg Angular 4下拉 PrimeNg Angular 4 的动态更改选项
【发布时间】:2018-11-12 07:18:27
【问题描述】:

我是 UI 开发和 PrimeNg 的新手,可能答案就在那里,但我找不到。 Anyhoo,我在一个 ngFor 循环中创建多个级别的下拉列表。例如,我有 2 间豪华房和套房。而Deluxe有Breakfast,Breakfast+Lunch,Breakfast+DinnerandSuite只有2个(Breakfast,Breakfast+Dinner)所有这些都是从DB获取数据生成的。

所以对于第一个下拉菜单,如果用户选择 Deluxe,第二个下拉菜单的选项应该有 3 个条目,而如果它选择 Suite,则选项应该只有 2。如何实现?

模板:

<div *ngFor="let room of flatRoomObject">
        <div>
          <span class="label" title="{{room.Room.Code}}" style="width: 500px;font-weight: normal">{{room.Room.Name}}</span>
          <span>
            <p-dropdown [options]="masterRooms" [style]="{'width':'195px'}" [(ngModel)]="room.Room.MasterId"></p-dropdown>
          </span>
        </div>
        <div *ngFor="let rateplan of room.Rateplans">
          <div>
            <span class="label" title="{{rateplan.Code}}" style="width: 500px;margin-left: 30px;font-weight: normal">{{rateplan.Name}}</span>
            <span>
              <p-dropdown [options]="masterRateplans" [style]="{'width':'165px'}" [(ngModel)]="rateplan.MasterId"></p-dropdown>
            </span>
          </div>
        </div>
      </div>

请注意,masterRooms 是房间列表,而 masterRateplans 是我打算根据第一个下拉列表中选择的房间动态更改的房间列表。 masterRooms 和 masterRateplan 从组件中的 Db 中获取。

【问题讨论】:

  • 发布您尝试过的代码。
  • 并更正您的标记... Primefaces相关...
  • 提供flatRoomObject的例子
  • @sabithpocker 假设 flatroomObject 是一个包含房间 ID、名称和代码的简单对象。

标签: angular primeng primeng-dropdowns


【解决方案1】:

您可以通过在第一个下拉菜单(即房间下拉菜单)的更改上更改 masterRateplans 的值来实现此目的。由于masterReteplans 是作为下拉选项提供的,因此在更改房间下拉组件中更改其值将更改房价计划下拉列表中可见的选项。

所以在 html 中,使用 (onChange) 来绑定一个改变房间下拉菜单的函数,例如我们将该函数命名为 changeRatePlan:

<div *ngFor="let room of flatRoomObject">
        <div>
          <span class="label" title="{{room.Room.Code}}" style="width: 500px;font-weight: normal">{{room.Room.Name}}</span>
          <span>
            <p-dropdown [options]="masterRooms" (onChange)="changeRatePlans()" [style]="{'width':'195px'}" [(ngModel)]="room.Room.MasterId"></p-dropdown>
          </span>
        </div>
        <div *ngFor="let rateplan of room.Rateplans">
          <div>
            <span class="label" title="{{rateplan.Code}}" style="width: 500px;margin-left: 30px;font-weight: normal">{{rateplan.Name}}</span>
            <span>
              <p-dropdown [options]="masterRateplans" [style]="{'width':'165px'}" [(ngModel)]="rateplan.MasterId"></p-dropdown>
            </span>
          </div>
        </div>
      </div>

然后在你的逻辑中,实现changeRatePlan函数来改变masterRateplans的值。类似于以下内容:

public roomTypes:any={
    "Deluxe": [{
            label: 'Breakfast',
            value: 'Breakfast'
        },
        {
            label: 'Breakfast and Lunch',
            value: 'Breakfast and Lunch'
        },
        {
            label: 'Breakfast and Dinner',
            value: 'Breakfast and Dinner'
        }
    ],
    "Suite": [{
            label: 'Breakfast',
            value: 'Breakfast'
        },
        {
            label: 'Breakfast and Dinner',
            value: 'Breakfast and Dinner'
        }
    ]
}

changeRatePlan(){
    //for example if MasterId 1 is for deluxe room
    if(this.room.Room.MasterId==1)
    {
        this.masterRateplans=this.roomTypes.Deluxe;
    }
    //for suite
    else if(this.room.Room.MasterId==2)
    {
       this.masterRateplans=this.roomTypes.Suite;
    }
}

请注意,上面的逻辑是为了让您了解如何实现该功能。您的实际实现可能会有所不同,例如您可能已经将房间类型存储在一个变量中,而我声明了一个新变量以供您理解。 希望这会有所帮助。

【讨论】:

  • 您好,感谢您的帮助!如果您注意到有多个房间以及都有自己的 rateplan 下拉菜单。因此,如果我更改绑定到 p-dropdown 的 options 属性的 masterRateplans 不会影响所有其他房间吗?
  • 这取决于你的逻辑。如果 masterRateplans 包含所有房间的计划,那么不要在每次房间更改时修改其值,而是在逻辑中创建一个新变量,比如说 currentSelectedRoomOptions,将其绑定到第二个下拉列表并在第一个下拉列表的更改中更新其值,即在 changeRatePlan 函数中.
猜你喜欢
  • 2020-07-11
  • 1970-01-01
  • 2018-05-20
  • 2019-09-08
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
  • 2018-05-09
  • 1970-01-01
相关资源
最近更新 更多