【问题标题】:Angular 8 dropdown for complex object复杂对象的 Angular 8 下拉菜单
【发布时间】:2020-03-26 23:07:01
【问题描述】:

在我的项目中,我将 .net Core 2.2 和 Angular 8 用于 UI。 我想根据它们的 id 实现复杂对象的下拉列表。 当我转到下拉列表时,我想根据他们的 ID 显示前:ProjectName。

我的 VirtualMachine 类看起来像:

    public class VirtualMachine
    {            
        public int Id { get; set; }    

        public string Name { get; set; }    

        public string IpAddress { get; set; }    

        public int DiskSize { get; set; }    

        public short CPU { get; set; }    

        public int Ram { get; set; }    

        public string ImageUrl { get; set; }

        public VMRole Role { get; set; }
        public VMStatus Status { get; set; }

        public int HypervisorId { get; set; }
        public Hypervisor Hypervisor { get; set; }

        public int ProjectId { get; set; }
        public Project Project { get; set; }

        public int ManagementId { get; set; }
        public Management Management { get; set; }
    }

我的控制器 POST 操作如下所示:

    [HttpPost("create")]
    public async Task<IActionResult> CreateVm(VirtualMachine vm)
    {
        if (await _repo.VmExists(vm.Name))
            return BadRequest("VM name already exists");

        vm.Hypervisor = _context.Hypervisors.SingleOrDefault(x => x.HypervisorId == 
        vm.HypervisorId);
        vm.Project = _context.Projects.SingleOrDefault(x => x.Id == vm.ProjectId);
        vm.Management = _context.Managements.SingleOrDefault(x => x.Id == vm.ManagementId);

        try
        {
            await _context.VirtualMachines.AddAsync(vm);
            await _context.SaveChangesAsync();
        }
        catch (DbUpdateException)
        {
            return BadRequest();
        }

        return Ok();
    }

邮递员 POST 正文:

{
    "name":"Abstergo",
    "ipAddress":"192.168.0.1",
    "diskSize":25,
    "cpu":16,
    "ram":100,
    "imageUrl":"www.google.com",
    "role":1,
    "status":0,
    "hypervisorId":1,
    "projectId":11,
    "managementId":8
}

Angular 打字稿类:

export class VirtualMachine {
    name: string;
    ipAddress: string;
    diskSize: number;
    cpu: number;
    ram: number;
    imageUrl: string;
    role: string;
    status: string;
    projectId: number;
    hypervisorId: number;
    managementId: number;
    projectName: Project;
    managementName: Management;
    hypervisorName: Hypervisor;
}

html代码

<div> 
 <select name="select" [(ngModel)]="model.hypervisorId"> 
  <option style="display:none"></option> 
  <option *ngFor="let data of model.Hypervisor" [ngValue]="data.hyperisorId"> {{data.model.hypervisorName}} </option> 
 </select> 
</div> 

【问题讨论】:

  • 可以在这里发布您在角度尝试过的代码
  • 澄清一下,要不要按ID确定顺序?还是您希望 ID 作为文本的一部分显示在选择列表中?
  • 如果要按ID对选择列表进行排序,请在检索到数据后对其进行排序。例如:假设 ID 是数字,您可以使用: items.sort((a, b) => { return a.id - b.id; });
  • 我想根据他们的 id 显示名字。例如:根据 projectId 的 projectName。我从 postgre 获得的这些数据。这3张表与VirtualMachine有关系。

标签: javascript c# angular typescript asp.net-core


【解决方案1】:

如果你想根据他们的Id显示ProjectName,那么你可以在显示之前对这个数组进行排序:

let hypervisor = [
    { projectName: "Abstergo 18", projectId: 18 },
    { projectName: "Abstergo 17", projectId: 17 },
    { projectName: "Abstergo 16", projectId: 16 },
];

hypervisor.sort((a, b) => a.projectId - b.projectId);
console.log(hypervisor);

所以你可以在ngOnInit()方法中排序:

hypervisor = [
    { projectName: "Abstergo 18", projectId: 18 },
    { projectName: "Abstergo 17", projectId: 17 },
    { projectName: "Abstergo 16", projectId: 16 },
];

ngOnInit() {
  this.hypervisor.sort((a, b) => a.projectId - b.projectId);    
}

HTML:

<div> 
   <select name="select"> 
       <option style="display:none">empty</option> 
       <option *ngFor="let data of hypervisor" 
           [ngValue]="data.projectId"> 
           {{data.projectName}} 
       </option> 
   </select> 
</div> 

可以在a stackblitz example看到。

【讨论】:

  • 情况是我正在使用解析器从数据库中获取所有数据。我需要从 db 获取数据而不是硬编码
  • @ArzuSuleymanov 这样您就可以连接结果数据并在连接后对它们进行排序
  • @StepUp 上面的例子对我来说很完美,但我还有另一个要求,想要默认复杂对象数组中的一个值(即管理程序)。我们如何实现这一目标
  • @GouthamNithyananda 很高兴它对您有所帮助!请阅读此What should I do when someone answers my question?。作为一种良好做法,最好提出新问题以简化其他用户的未来搜索。
  • @GouthamNithyananda stackoverflow.com/a/63192748/13596406 检查此项以在下拉列表中获取默认选择值
猜你喜欢
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多