Tobe
Julho 2, 2021, 5:45pm
#41
Então Lucas: consegui fazer cadasstrar e listar: o problema agora é o seguinte: adicionar a lista de nomes no selectbox: a lista está vindo assim:
["Pompeo Cesar da Silva","Aristoteles Floriano Canani","Arquimedes Medievali","Confucio Tanaka"]
estou listando no método:
RetornaFuncionarios(){
this.funcionarioService.getNomeFuncionarios().subscribe(data=> {this.nomeDosFuncionarios=data;});
console.log(this.funcionarioService);
}
eu acho que tem haver com o formato do metodo:
this.http.get<String[]>(this.url)
e do atributo que recebe esse metoto:
nomeDosFuncionarios:String[];
//nomeDosFuncionarios:String[] = ["Pompeo Cesar da Silva","maria","joao"];
Que está na componente:
import { ServiceService } from '../../Service/service.service';
import { FuncionarioService } from '../../Service/funcionario.service';
import { Atividade } from 'src/app/Modelo/Atividade';
import { Funcionario } from 'src/app/Modelo/Funcionario';
import { Observable } from 'rxjs';
@Component({
selector: 'app-adicionar',
templateUrl: './adicionar.component.html',
styleUrls: ['./adicionar.component.css']
})
export class AdicionarComponent implements OnInit {
Vc não deveria está usando o nome do funcionário assim. O nome é um dado fraco para ser usado na identificação de algum registro. O melhor seria usar um ID. Assim, vc poderia retornar a lista de funcionários do endpoint e usar o ID como valor na combobox e o nome como label.
Tobe
Julho 2, 2021, 6:48pm
#43
Na verdade eu seleciono o nome do funcionario no selectbox e envio para spring, no spring com o nome do funcionario eu busco u funcionário todo ai eu adiciono o funcionario na atividade e cadastro a atividade:
sabe uma solução para o selectbox receber esses nomes?
Se tiver 2 funcionarios com mesmo nome?
Tente assim:
<select [(ngModel)]="atividade.nomeSelecionado">
<option *ngFor="let nome of nomesFuncionarios" [ngValue]="nome">{{nome}}</option>
</select>
Altere para usar formControl em vez de ngModel .
Tobe
Julho 2, 2021, 7:05pm
#45
O meu está assim ó, quando eu uso o array preenchido ele funciona, quando uso o outro array que tras os nomes ele não funciona:
//nomeDosFuncionarios:String[];
nomeDosFuncionarios:String[] = ["Pompeo Cesar da Silva","maria","joao"];
O meu selectbox está assim: você consegue usar as minhas variaveis pra ficar mais óbvio:
<select class="form-control" id="funcionario" formControlName="funcionario" style="background-color: lightblue;">
<option *ngFor="let funcionario of nomeDosFuncionarios" [ngValue]="funcionario">
{{ funcionario}}
</option>
</select>
O array está sendo preenchido assim: por isso penso que tem erro entre <String[]> e String[] :
RetornaFuncionarios(){
this.funcionarioService.getNomeFuncionarios().subscribe(data=> {this.nomeDosFuncionarios=data;});
console.log(this.funcionarioService);
}
E desse jeito não tah funcionando? Da algum erro?
Tobe
Julho 2, 2021, 7:35pm
#47
Quando uso o debaixo funciona, quando uso o de cima não
//nomeDosFuncionarios:String[];
nomeDosFuncionarios:String[] = ["Pompeo Cesar da Silva","maria","joao"];
Onde vc está chamando a função RetornaFuncionarios da classe ServiceService ?
Tobe
Julho 2, 2021, 7:45pm
#49
O array está sendo preenchido assim: por isso penso que tem erro entre <String[]> e String[] :
RetornaFuncionarios(){
this.funcionarioService.getNomeFuncionarios().subscribe(data=> {this.nomeDosFuncionarios=data;});
console.log(this.funcionarioService);
}
Mas quem tah chamando RetornaFuncionarios ? Ou RetornaFuncionarios é uma função que está declarada no próprio componente?
Tobe
Julho 2, 2021, 7:50pm
#51
Está no componente:
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
import { ServiceService } from '../../Service/service.service';
import { FuncionarioService } from '../../Service/funcionario.service';
import { Atividade } from 'src/app/Modelo/Atividade';
import { Funcionario } from 'src/app/Modelo/Funcionario';
import { Observable } from 'rxjs';
@Component({
selector: 'app-adicionar',
templateUrl: './adicionar.component.html',
styleUrls: ['./adicionar.component.css']
})
export class AdicionarComponent implements OnInit {
nomeDosFuncionarios:String[];
//nomeDosFuncionarios:String[] = ["Pompeo Cesar da Silva","maria","joao"];
funcio:Funcionario;
atividade:Atividade;
constructor(private funcionarioService: FuncionarioService, private formBuilder:FormBuilder, private service:ServiceService, private router: Router) {
this.RetornaFuncionarios();
this.funcio = new Funcionario;
this.funcio.id=1
this.funcio.cpf='';
this.funcio.nome='';
this.funcio.cargo='';
}
formulario: any = FormGroup;
ngOnInit(): void {
this.formulario = this.formBuilder.group({
descricao: [''],
status: [''],
prioridade: [''],
funcionario: [''],
dataPrevista: [new Date]
});
}
RetornaFuncionarios(){
this.funcionarioService.getNomeFuncionarios().subscribe(data=> {this.nomeDosFuncionarios=data;});
console.log(this.funcionarioService);
}
OnSubmit(){
this.funcio.nome = this.formulario.get('funcionario').value
this.atividade = this.formulario.value;
this.atividade.funcionario = this.funcio;
console.log(this.atividade);
this.service.createAtividade(this.atividade)
.subscribe(data=>{alert("Se agrego com exito...!!!");
this.router.navigate(["listar"]);
console.log(this.atividade);
this.formulario.reset(this.atividade);
})
}
Mude a função para ficar assim:
RetornaFuncionarios() {
this.funcionarioService.getNomeFuncionarios().subscribe(data => {
console.log(data);
this.nomeDosFuncionarios = data;
});
}
E veja o que é impresso no console.
Tobe
Julho 2, 2021, 8:05pm
#53
Não funcionou: selectbox vazio:
Tobe
Julho 2, 2021, 8:08pm
#54
Se clicar no link ‘http:localhost://8080:funcionarios’: aparece
Ah rapaz, o problema é o CORS. Vc tem que permitir o backend receber requisições de outro dominio.
Por exemplo, o dominio http://localhost:8080 é diferente de http://localhost:3000 .
Faça um teste, coloque a anotação @CrossOrigin no método do endpoint, e tente de novo.
Viu como é importante o console? Ele é uma ferramenta muito importante quando trabalhar no frontend.
Tobe
Julho 2, 2021, 8:20pm
#56
Seria isso?
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Funcionario } from '../Modelo/Funcionario';
@Injectable({
providedIn: 'root'
})
export class FuncionarioService {
constructor(private http:HttpClient) { }
url='http://localhost:8080/funcionarios/nomes';
createAtividade(funcionario:Funcionario){
return this.http.post<Funcionario>(this.url,funcionario);
}
@CrossOrigin
getNomeFuncionarios(){
return this.http.get<String[]>(this.url);
}
//getNomeFuncionarios(){
//return this.http.get<String[]>(this.url);
// }
}
Nâo. A anotação @CrossOrigin tem que ser colocada lah no projeto spring.
Tobe
Julho 2, 2021, 8:23pm
#58
No controler está assim:
package com.petter.tasks.api.controller;
import java.util.List;
import javax.validation.Valid;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import com.petter.tasks.domain.exception.CadastroFuncionarioException;
import com.petter.tasks.domain.model.Atividade;
import com.petter.tasks.domain.model.Funcionario;
import com.petter.tasks.domain.service.AtividadeService;
import com.petter.tasks.domain.service.FuncionarioService;
import lombok.AllArgsConstructor;
@CrossOrigin(origins = "http://localhost:4200", maxAge = 3600)
@AllArgsConstructor
@RestController
@RequestMapping("/atividades")
public class AtividadeController {
private AtividadeService as;
//////////////////LISTA TODAS AS ATIVIDADES
@GetMapping
public List<Atividade> listar() {
System.out.println("chegou aui");
return as.listar();
}
```
Desse jeito acho que resolve. (poderia ser soh @CrossOrigin também)
Tobe
Julho 2, 2021, 8:26pm
#60
Pelo que pesquisei acho que tem haver
com: import { Observable } from ‘rxjs’;