【问题标题】:Angular2 updated to rc5 and @angular/router - ORIGINAL EXCEPTION: No provider for RouterAngular2 更新为 rc5 和 @angular/router - 原始例外:没有路由器提供者
【发布时间】:2016-08-19 07:58:10
【问题描述】:

我已经从 rc4 -> rc5 更新了我们的项目。这似乎工作正常。 在这样做的同时,我还将我们的代码从使用@angular/router-deprecated 更新为@angular/router

我的应用程序由 2 个部分组成,公共和受保护(公共适用于所有用户,受保护仅适用于管理员)。但目前我只想让 1 条路线正常工作,然后我可以修复其他页面。

正如我所说,我已经更新了所有代码,我认为这是正确的,并且页面会加载,直到我将其添加到我的页面 [routerLink]="['Home']"

如果我添加这个,那么我会得到异常

原始例外:路由器没有提供者!

如果我再次注释掉这一行,页面都可以正常加载。

这是我的一些代码

app.module.ts

import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule }   from '@angular/forms';
import { RouterModule } from '@angular/router';
import { HttpModule } from '@angular/http';

import { AppRoutes } from './app.routes';
import { AppComponent }  from './app.component';
import { PublicComponent } from './public.component';
//import { ProtectedComponent } from './protected.component';

// cms
import { HomeComponent } from './cms/home.component';

@NgModule({
    imports: [
        BrowserModule,
        FormsModule,
        HttpModule,
        RouterModule.forRoot(AppRoutes)
    ],
    declarations: [
        AppComponent,
        PublicComponent,
        HomeComponent
    ],
    bootstrap: [ AppComponent ]
})

export class AppModule { }

app.routes.ts

import { PublicComponent } from './public.component';
import { ProtectedComponent } from './protected.component';

// public
import { HomeComponent } from './cms/home.component';


export const AppRoutes = [
    {
        path: '',
        component: PublicComponent,
        children: [
            {
                path: '',
                redirectTo: 'home',
                pathMatch: 'full'
            },
            {
                path: 'home',
                component: HomeComponent
            },
        ]
    },
    // {
    //     path: 'admin/...',
    //     component: ProtectedComponent
    // }
];

app.component.ts

import { Component, ViewContainerRef } from '@angular/core';
import { ROUTER_DIRECTIVES } from '@angular/router'

@Component({
    selector: 'app-root',
    template: '<router-outlet></router-outlet>',
    directives: [ ROUTER_DIRECTIVES ]
})

export class AppComponent {
    viewContainerRef: ViewContainerRef;

    constructor(viewContainerRef: ViewContainerRef) {
        this.viewContainerRef = viewContainerRef;
    }
}

ma​​in.ts

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app.module';

platformBrowserDynamic().bootstrapModule(AppModule);

public.component.ts

import { Component, OnInit } from '@angular/core';
import { Router, ROUTER_DIRECTIVES } from '@angular/router';
import { CmsService } from './cms/cms.service';
import { ModuleService } from './module/module.service';
import { MenuItem } from './cms/models/menu-item';
import { Settings } from './cms/models/settings';
import { CollapseDirective } from 'ng2-bootstrap/components/collapse';
import { OffClickDirective } from './shared/offclick.directive';

@Component({
    selector: 'public',
    templateUrl: 'app/public.component.html',
    directives: [ ROUTER_DIRECTIVES, CollapseDirective, OffClickDirective ],
    providers: [ CmsService, ModuleService ]
})

export class PublicComponent {
    menu: MenuItem[];
    settings: Settings;
    isCollapsed: boolean = true;

    constructor(
        private cmsService: CmsService,
        private router: Router) {
    }
}

public.component.html

<div class="navbar navbar-dark bg-inverse navbar-fixed-top" role="navigation">
    <div class="container">
        <a class="navbar-brand" [routerLink]="['Home']">
            <span class="fa fa-home fa-2x" aria-hidden="true"></span>
            <span class="sr-only">Home</span>
        </a>
    </div>
</div>

我已尝试将Router 添加到public.component.ts 的提供程序部分,但随后出现如下异常。

错误:无法解析路由器的所有参数:(?, ?, ?, ?, ?, ?, ?, ?)

我显然错过了一些东西,但不知道是什么。任何帮助将不胜感激。

把它包起来,这也是我的 package.json 文件中的角度参考

"dependencies": {
    "@angular/common": "^2.0.0-rc.5",
    "@angular/compiler": "^2.0.0-rc.5",
    "@angular/core": "^2.0.0-rc.5",
    "@angular/forms": "^0.3.0",
    "@angular/http": "^2.0.0-rc.5",
    "@angular/platform-browser": "^2.0.0-rc.5",
    "@angular/platform-browser-dynamic": "^2.0.0-rc.5",
    "@angular/router": "^3.0.0-rc.1",
    "@angular/router-deprecated": "2.0.0-rc.2",
    "@angular/upgrade": "^2.0.0-rc.3"
}

【问题讨论】:

    标签: javascript angularjs angular routing


    【解决方案1】:
    1. 从 app.module.ts 中删除路由器模块
    2. 调整 app.module.ts

      ...
      import { routing, appRoutingProviders } from './app.routing';
      ...
      
      @NgModule({
        imports: [
          ...
          routing,
          ...
        ],
        ...
        providers: [
          ...
          appRoutingProviders,
          ...
        ],
        bootstrap: [AppComponent],
      })
      export class AppModule { }
      
    3. 调整app.routing.ts:

      import { Routes, RouterModule } from '@angular/router';
      import { DashboardComponent } from './dashboard/dashboard.component';
      ...
      import { Http, HTTP_PROVIDERS } from '@angular/http';
      
      const appRoutes: Routes = [
        { path: '', redirectTo: '/dashboard', pathMatch: 'full'},
        { path: 'dashboard', component: DashboardComponent, canActivate: [AuthGuard]},
        ...
        { path: '**', redirectTo: 'dashboard', pathMatch: 'full'}
      ];
      
      export const appRoutingProviders: any[] = [
        ...
        Http,
        HTTP_PROVIDERS
      ];
      
      export const routing = RouterModule.forRoot(appRoutes);
      
    4. 到处删除 ROUTER_DIRECTIVES

    【讨论】:

      猜你喜欢
      • 2016-12-22
      • 1970-01-01
      • 2016-12-18
      • 2016-11-27
      • 2016-12-20
      • 2016-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多