Navegue para outra página com um botão no angular 2

112

Estou tentando navegar para outra página clicando em um botão, mas não funciona. Qual poderia ser o problema. Agora estou aprendendo angular 2 e é um pouco difícil para mim agora.

//Routes/Path in a folder call AdminBoard

export const AdminRoutes: Routes =[

  {
    path: 'dashboard',

    component: AdminComponent,
    children: [
      {path: '', redirectTo: 'Home'},
      {path: 'Home', component: HomeComponent},
      {path: 'Service', component: ServiceComponent},
      {path: 'Service/Sign_in', component:CustomerComponent}

    ]

  }

];

//Button is also in a different folder. Click button to navigate to this page           {path: 'Service/Sign_in', component:CustomerComponent}

  <button class="btn btn-success pull-right" ><a routerLink="/Service/Sign_in"> Add Customer</a></button>
Liska Liskor
fonte
1
tente algo assim:<button class="btn btn-success pull-right" ><a [routerLink]="[ '.', 'Service/Sign_in' ]"> Add Customer</a></button>
Avnesh Shakya

Respostas:

253

Use-o assim, deve funcionar:

 <a routerLink="/Service/Sign_in"><button class="btn btn-success pull-right" > Add Customer</button></a>

Você também pode usar router.navigateByUrl('..')desta forma:

<button type="button" class="btn btn-primary-outline pull-right" (click)="btnClick();"><i class="fa fa-plus"></i> Add</button>    

import { Router } from '@angular/router';

btnClick= function () {
        this.router.navigateByUrl('/user');
};

Atualizar

Você tem que injetar Routerno construtor assim:

constructor(private router: Router) { }

só então você será capaz de usar this.router. Lembre-se também de importar RouterModuleem seu módulo.

Atualização 2

Agora, após o Angular v4, você pode adicionar routerLinkatributos diretamente no botão (conforme mencionado por @mark na seção de comentários) como abaixo -

 <button [routerLink]="'/url'"> Button Label</button>
Pardeep Jain
fonte
2
posso enviar alguns dados com ele?
Anuj,
12
Não tenho certeza se as coisas mudaram desde que isso foi escrito, mas desde outubro de 2018, parece que você pode simplesmente colocar o [routerLink]atributo diretamente no <button>(o que evita alguns problemas de estilo que podem surgir ao envolver o botão em um <a>)
Mark Adelsberger
Então, qual caminho é o mais limpo? É melhor não expor a rota na marcação, mas mantê-la no arquivo datilografado, ou a 'nova' maneira com [routerLink]o modelo é a melhor?
Rin e Len
cabe a você, IMO, não há lógica para ocultar sua marcação no template conforme você vai navegar até o usuário pode ver na próxima página. Descansar ambos são iguais, eu acho
Pardeep Jain
1
No primeiro nível html fileonde o componente vai ser carregado tem que ter <router-outlet></router-outlet>tag. consulte angular.io/api/router/RouterOutlet#description para obter mais detalhes.
Tharusha
36

Você pode usar o routerLink da seguinte maneira,

<input type="button" value="Add Bulk Enquiry" [routerLink]="['../addBulkEnquiry']" class="btn">

ou use <button [routerLink]="['./url']">no seu caso, para obter mais informações, você pode ler todo o stacktrace no github https://github.com/angular/angular/issues/9471

os outros métodos também estão corretos, mas eles criam uma dependência no arquivo do componente.

Espero que sua preocupação seja resolvida.

Ronit Oommen
fonte
1
@Ronit Por que não apenas: <button type = "button" value = "Add Bulk Inquiry" routerLink = "../ addBulkEnquiry" class = "btn">? Por que você está usando colchetes?
Andy King
1
@AndyKing Porque ele está usando uma expressão (um array como valor), foo="boo" é como [foo]="'boo'". Talvez você queira ler stackoverflow.com/questions/43633452/…
PhoneixS
1
Eu prefiro esta resposta
HungNM2
13
 <button type="button" class="btn btn-primary-outline pull-right" (click)="btnClick();"><i class="fa fa-plus"></i> Add</button>


import { Router } from '@angular/router';

btnClick= function () {
        this.router.navigate(['/user']);
};
Aniket
fonte
Eu fiz algo parecido com isso no início (usando router.navigate), depois procurei outras idéias e agora uso routerLink conforme mencionado em outras respostas. Eu me pergunto o que é melhor, ou se isso importa ...
Scott
1

É importante decorar o link do roteador e vinculá-lo com colchetes da seguinte maneira:

<a [routerLink]="['/service']"> <button class="btn btn-info"> link to other page </button></a>

Onde " / serviço ", neste caso, é o URL do caminho especificado no componente de roteamento.

Mwiza
fonte
0

Ter o link do roteador no botão parece funcionar bem para mim:

<button class="nav-link" routerLink="/" (click)="hideMenu()">
     <i class="fa fa-home"></i> 
     <span>Home</span>
</button>
Rob McCabe
fonte
0

você pode mudar

    this.router.routeReuseStrategy.shouldReuseRoute = () => false;

no nível do componente no construtor como abaixo

    constructor(private router: Router) {
            this.router.routeReuseStrategy.shouldReuseRoute = () => false; 
}
Mad Javad
fonte
0

Siga esses passos

Adicionar importação em seu componente principal

import {Router } from '@angular/router';

No mesmo arquivo, adicione o código abaixo para o construtor e o método

constructor(private route: Router) {}
public Dashbord()
{
 this.route.navigate(['/dashboard']);
}

Este é o seu .htmlcódigo de arquivo

<button mat-button (click)="Dashbord()">Dashboard</button><br>

No app-routing.module.tsarquivo, adicionar painel

const routes: Routes =
[
  { path: '', pathMatch: 'full' ,component: TestComponent},
  { path: 'dashboard', component: DashboardComponent } 
];

Boa sorte.

Arvind Chourasiya
fonte