2
respostas

URL muda mas os metodos não estão sendo acionados

Estou em um form de pesquisa, que como resultado redireciona para a rota que vai escrever o resultado na tela. Quando eu mudo o parâmetro da pesquisa, a URL é reescrita, mas o método de pesquisa dos dados não é acionada. Achei esse trecho na internet: The router only destroys and recreates the component when it navigates to a different route. When only route params or query params are updated but the route is the same, the component won't be destroyed and recreated.

Como eu implemento isso no angular?

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
2 respostas

Boa noite, Leonardo! Como vai?

Vc poderia compartilhar o seu código e indicar qual o método que vc gostaria que fosse acionado? Por favor, também passe o máximo de informações que puder! Assim o pessoal aqui do fórum poderá analisar o que está acontecendo!

Onde está o problema que eu acompanhei através do console.log():

1) Quando inicio a aplicação e faço a pesquisa, ele retorna os dados. Isso acontece porque ele entra no onInit do houseListComponent.

2) Se eu clico para voltar para o menu principal, ele destroi o componente e eu posso fazer nova pesquisa.

3) Entretanto, se eu tentar fazer duas pesquisas seguidas, ele não muda os dados. O houseService vai ao banco de dados e faz a pesquisa, mas os dados não são disponibilizados para a aplicação, que está a cargo do OnInit().


No appComponent.html

  <div class="form-inline my-2 my-lg-0">
    <form [formGroup]="searchForm" class="form mt-4" (submit)="pesquisar()">
      <div class="form-group">
        <input
          formControlName="searching"
          class="form-control mr-sm-2"
          type="search"
          placeholder="searching for ..."
          aria-label="Search"
          autofocus>
        <button
          class="btn btn-outline-success my-2 my-sm-0"
          type="submit"
          [disabled]="searchForm.invalid">Search
        </button>
      </div>
    </form> 
  </div>

// No appComponent.ts:
  pesquisar() {
    const searching = this.searchForm.get('searching').value ;
    this.router.navigate(['/houses/', searching]);
  }


// No appRouting.module

const routes: Routes = [
  { path: 'houses/:searching',
    component: houseListComponent,
    resolve: {
      houses: houseResolver }
  },


// No housesResolve

    resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<house[]> {
        const searching = route.params.searching ; 
        if (searching) {
          return this.houseService.searchhouse(searching);
        }
        return of(null);
    }
}

// No houseService:

    searchhouse( searching: string ) {
    this.endereco = API + 'localiza?palavra=' ;
    return this.http.get<house[]>(this.endereco + searching).pipe(
        retry(1),
        catchError(e => throwError(e)) ) ;

    }

// houseListComponent:

export class houseListComponent implements OnInit, OnDestroy {

  @BlockUI() blockUI: NgBlockUI;
  searching = '' ;
  houses: house[] = [];

  inscricao: Subscription ;

  constructor( private route: ActivatedRoute ) { }

  ngOnInit() {
    console.log('3 - OnInit do houseList');

    this.inscricao = this.route.params.subscribe(
      (params: any) => {
        this.searching = params.searching ;
      }
    );

    if (this.searching) {
       this.houses = this.route.snapshot.data.houses;
    }
  }

  ngOnDestroy() {
    console.log('OnDestroy do houseList');
    this.inscricao.unsubscribe() ;
  }

}
// No houseListComponent.html

<div style="height: 50px" class="row" *ngFor="let house of houses">
    <div class="col-md-3">{{house.titulo}}</div>
    <div class="col-md-4">{{house.endereco}}</div>
</div>