Navega a otra página con un botón en angular 2

112

Estoy intentando navegar a otra página haciendo clic en un botón, pero no funciona. Cual podría ser el problema. Ahora estoy aprendiendo angular 2 y ahora es un poco difícil para mí.

//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
fuente
1
prueba algo como esto:<button class="btn btn-success pull-right" ><a [routerLink]="[ '.', 'Service/Sign_in' ]"> Add Customer</a></button>
Avnesh Shakya

Respuestas:

254

Úselo así, debería funcionar:

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

También puedes usar router.navigateByUrl('..')así:

<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');
};

Actualizar

Tienes que inyectar Routeren el constructor así:

constructor(private router: Router) { }

solo entonces podrás usar this.router. Recuerde también importar RouterModuleen su módulo.

Actualización 2

Ahora, después de Angular v4, puede agregar directamente un routerLinkatributo en el botón (como lo menciona @mark en la sección de comentarios) como se muestra a continuación:

 <button [routerLink]="'/url'"> Button Label</button>
Pardeep Jain
fuente
2
¿Puedo enviar algunos datos con él?
Anuj
12
No estoy seguro de si las cosas han cambiado desde que se escribió esto, pero a partir de octubre de 2018, parece que puede poner el [routerLink]atributo directamente en <button>(lo que evita algunos problemas de estilo que pueden surgir al envolver el botón en un <a>)
Mark Adelsberger
Entonces, ¿cuál es la forma más limpia? ¿Es mejor no exponer la ruta en el marcado, sino mantenerla en el archivo mecanografiado, o es la "nueva" forma [routerLink]en la plantilla la forma a seguir?
Rin y Len
Depende de usted, en mi opinión, no hay lógica para ocultar su marcado en la plantilla, ya que va a navegar hasta que el usuario puede ver en la página siguiente. Descanso, ambos son iguales, supongo
Pardeep Jain
1
En el primer nivel html filedonde se cargará el componente debe tener <router-outlet></router-outlet>etiqueta. consulte angular.io/api/router/RouterOutlet#description para obtener más detalles.
Tharusha
36

Puede utilizar routerLink de la siguiente manera,

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

o use <button [routerLink]="['./url']">en su caso, para obtener más información, puede leer el stacktrace completo en github https://github.com/angular/angular/issues/9471

los otros métodos también son correctos pero crean una dependencia en el archivo del componente.

Espero que se resuelva su inquietud.

Ronit Oommen
fuente
1
@Ronit ¿Por qué no solo: <button type = "button" value = "Add Bulk Inquiry" routerLink = "../ addBulkEnquiry" class = "btn">? ¿Por qué utiliza los corchetes?
Andy King
1
@AndyKing Porque está usando una expresión (una matriz como valor), foo="boo" es como [foo]="'boo'". Quizás quieras leer stackoverflow.com/questions/43633452/…
PhoneixS
1
Prefiero esta respuesta
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
fuente
Hice algo similar como esto al principio (usando router.navigate), luego busqué otras ideas y ahora uso routerLink como se menciona en otras respuestas. Me pregunto cuál es mejor, o si importa ...
Scott
1

Es importante que decore el enlace del enrutador y el enlace con corchetes de la siguiente manera:

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

Donde " / servicio " en este caso es la URL de ruta especificada en el componente de enrutamiento.

Mwiza
fuente
0

Tener el enlace del enrutador en el botón parece funcionar bien para mí:

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

tu puedes cambiar

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

a nivel de componente en el constructor como abajo

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

Sigue estos pasos

Agregue importación en su componente principal

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

En el mismo archivo, agregue el siguiente código para el constructor y el método

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

Este es su .htmlcódigo de archivo

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

En app-routing.module.tsarchivo, agregar panel

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

Buena suerte.

Arvind Chourasiya
fuente