I'm having trouble getting Angular 2 routing to work. I am using Angular 2 and Webpack. In the Angular 2 webpack starter, I noticed they had webpack generating their html and their links, but I was hoping I would not have to webpack my html files.
Here's my app.routes.ts...
import { ModuleWithProviders } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { HomeComponent } from "./home/home.component";
import { ScheduleComponent } from "./schedule/schedule.component";
import { PageNotFoundComponent } from "./PageNotFoundComponent";
const appRoutes: Routes = [
{ path: '', component: HomeComponent },
{ path: 'schedule', component: ScheduleComponent },
{ path: '**', component: PageNotFoundComponent }
];
export const appRoutingProviders: any[] = [
];
export const routing: ModuleWithProviders = RouterModule.forRoot(appRoutes);
Here's my @NgModule code...
@NgModule({
imports: [
BrowserModule,
HttpModule,
FormsModule,
routing ],
declarations: [
AppComponent,
AppBanner,
AppLogin,
HomeComponent,
ScheduleComponent,
PageNotFoundComponent
],
bootstrap: [ AppComponent ],
providers: [
ApplicationState,
appRoutingProviders
]
})
export class AppModule { }
Here is the schedule component...
import { Component } from '@angular/core';
@Component({
template: `
<div>Schedule</div>
`
})
export class ScheduleComponent {
}
And here's my HTML where I tried to add my routes...
<a [routerLink]=" ['/schedule'] ">Schedule</a>
I know this is a lot of code, but here is my webpack build as well. As you can see, the webpack task does not touch my HTML pages, so this webpack code may be irrelevant...
module.exports = {
entry: {
'polyfills': __dirname + '/src/polyfills.ts',
'vendor': __dirname + '/src/vendor.ts',
'app': __dirname + '/src/main.ts'
},
output: {
filename: '[name].bundle.js',
path: __dirname + '/src/bundle/',
publicPath: '/',
sourceMapFilename: __dirname + '/src/bundle/[name].bundle.map.js'
},
resolve: {
extensions: ['', '.ts', '.js'],
alias: { 'rxjs': 'rxjs-es' }
},
module: {
loaders: [
{
test: /\.js$/,
loader: 'babel-loader',
query: {
presets: ['es2015']
}
},
{
test: /\.ts$/,
loaders: ['awesome-typescript-loader']
},
{
test: /\.css$/,
loader: ExtractTextPlugin.extract("style-loader", "css-loader")
},
{ test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: "file?name=/fonts/[name].[ext]" },
{ test: /\.(woff|woff2)$/, loader:"url?prefix=font/&limit=5000&name=/fonts/[name].[ext]" },
{ test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=application/octet-stream&name=/fonts/[name].[ext]" },
{ test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: "url?limit=10000&mimetype=image/svg+xml&name=/fonts/[name].[ext]" }
]
},
plugins: [
new ExtractTextPlugin('css/[name].css')
]
}
Unfortunately, when I click on the Schedule link, I just get an error. Here's the detailed error info from zone...
Unhandled Promise rejection: no elements in sequence ; Zone: angular ;
Task: Promise.then ; Value: Error: no elements in sequence(…)
EmptyError: no elements in sequence
Any tips? What is the problem here?
Add pathMatch: 'full'
{ path: '', component: HomeComponent, pathMatch: 'full' },
otherwise both routes
{ path: '', component: HomeComponent },
{ path: 'schedule', component: ScheduleComponent },
match on route /schedule
because ''
matches, but doesn't consume anything from the route and then also 'schedule'
matches.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With