方法参数angular

时间:2018-06-20 18:24:35

标签: angular typescript

@编辑

我有一个用户表,用户可以在一个组件中创建或更新所有情况下插入新数据或更新表项,因为用户最多只能输入3个, 但他可以创建或编辑很多内容,例如节,marca等等。 当他访问一个项目时,要创建或编辑带有查询参数的项目。例如,如果是secao或marca。实际上,我正在使用swicth case来创建或编辑他要编辑的数据:

  this.route.queryParams.subscribe( params =>{
       this.id = params['id'];
       this.nome = params['nome'];
       this.descricao = params['descricao'];
       this.podeFracionar = params['podeFracionar'];
       this.entidade = params['entidade'];

       if(this.id !== undefined) this.atualizar = true;
      });
  

switch(this.entidade){
     case 'secao':
          if(this.atualizar){
            this.secaoService.update(this.id, this.entidadesForm.value).subscribe(secao => {
              this.location.back()
            },
          erro => console.log(erro))
          }else{
            this.secaoService.save(this.entidadesForm.value).subscribe(secao=>{
              this.location.back()
             },
           erro =>{
             console.log(erro)
           })
          }
          break;

          case 'marca':
          if(this.atualizar){
            this.marcaService.update(this.id, this.entidadesForm.value).subscribe(secao => {
              this.location.back()
            },
          erro => console.log(erro))
          }else{
            this.marcaService.save(this.entidadesForm.value).subscribe(secao=>{
              this.location.back()
             },
           erro =>{
             console.log(erro)
           })
          }
          break;

}

在所有情况下,我都致电服务进行保存或更新。 我可以为每种情况创建一个服务并传递类,方法中的参数如何调用相应的类,或者有其他形式对其进行优化?

@Edit谢谢您回答我的问题。现在我想知道如何卸下此开关盒

2 个答案:

答案 0 :(得分:2)

这是多态性的好用例。您的每个服务都应实现一个interface,例如IPersitThings。然后,您可以使您的开关仅分配该变量:

let service: IPeristThings;
switch (serviceType) {
   case 'service1':
      service = this.service1;
      break;
   case 'service2':
      service = this.service2;
      break;
}

// Do stuff with service

请注意,有一种比switch更好的方法来获取适当的服务实例;但是您的问题中没有足够的细节可以确定。

答案 1 :(得分:1)

我认为,如果将您的service类分解为两个服务,而只需使用方法update(..., ... , type)save(..., type)创建一个服务,那您会得到一个较小的switch事件中,您可以创建另一个类似这样的功能:

      case 'secao':
      callRepository('secao')
      break;

      case 'marca':
      callRepository('marca') 
      break;

    callRepository(type){
          if(this.atualizar){
            this.customService.update(this.id, this.entidadesForm.value, type)
            .subscribe(()=> this.location.back()
            ,erro => console.log(erro))
          }else{
            this.customService.save(this.entidadesForm.value, type)
            .subscribe(()=> this.location.back()
            ,erro => console.log(erro))
          }

    }

即使您可以通过直接传递包含secaomarca的值并直接使用函数

来删除该开关
callRepository(varValue);