Получение ошибки Angular2 "Нет провайдера для маршрутизатора! (RouterOutlet → Router) '

Я использую Angular2 alpha39 и Babel, чтобы передать файл ES6 ES6. Я не использую typescript.

Я создал компонент, который отображается правильно. Я добавил в шаблон роутер-выход. Когда я запускаю приложение, я получаю сообщение об ошибке:

Нет провайдера для маршрутизатора! (RouterOutlet → Router)

Стек вызова:

введите описание изображения здесь

Вот фрагмент кода:

шаблон:

.... // Removed for brevity
<div class="contenttext">
    <router-outlet></router-outlet>
</div>
.... // Removed for brevity

Компонентный файл:

import { Component, View, bootstrap,  OnInit } from 'angular2/angular2';
import { RouteConfig, RouterOutlet, RouterLink } from 'angular2/router';
import 'reflect-metadata';
import 'winjs';

@Component({
    selector: 'dashboard-app'
})
@View({
    templateUrl: '../js/dashboard.html',
    directives: [ ContentComponent, FamiliesComponent, RouterOutlet, RouterLink ]
})
@RouteConfig([ 
    { path: '/employees', component: EmployeesComponent, as: 'employees'} 
]) 
class DashboardAppComponent implements OnInit {
    constructor() {
    }

    onInit() {
        WinJS.UI.processAll().done(function() {
            var splitView = document.querySelector(".splitView").winControl;
            new WinJS.UI._WinKeyboard(splitView.paneElement);
        })
    }
}

bootstrap(DashboardAppComponent);

Ответ 1

вы должны использовать:

  • ROUTER_BINDINGS в вашем бутстрапе.
  • в вашем index.html.
  • если возможно, используйте состояние i.e как "сотрудники" в capizeize i.r как "Employees". (в alpha 42 я решаю одну проблему таким образом).

Надеюсь, это поможет вам.

- ОБНОВЛЕНИЕ -

после повтора альфа41:

  • ROUTER_BINDINGS изменен с помощью ROUTER_PROVIDERS.
  • Псевдонимы маршрутизатора должны быть в режиме верблюда.
  • для Router-outler и router-link вам просто нужно импортировать ROUTER_DIRECTIVES в ваше свойство директивы в аннотации компонентов.
  • Router-link ожидает, что значение будет массивом имен маршрутов. для получения дополнительной информации. см. здесь.

для получения дополнительной информации о маршрутизации вы можете обратиться к этому учебнику здесь.

--- Update2 ---

  • Теперь (из альфа-49) маршрутизатор экспортируется как ng.router.
  • (Согласно альфа-47 все крючки жизненного цикла переименованы в.)

    onActivate, onReuse, onDeactivate, canReuse, canDeactivate

    To: -

    routerOnActivate, routerOnReuse, routerOnDeactivate, routerCanReuse, routerCanDeactivate

--- Update3 ---

  • Router-link изменен на routerLink

  • и свойство routeeconfig изменено на:

    {path: '/abc', component: ABC, as: 'abc'} чтобы: {path: '/xyz' , component: XYZ, name: 'xyz'}

- Обновление 4 -

ОБНОВЛЕНИЕ К ANGULAR2 RC

Есть много изменений в маршрутизации в ANGULAR2 после того, как RC некоторые из них указывают, что я упомянул здесь, может помочь кому-то: -

  • angular2/router был изменен с помощью @angular/router (также вы можете использовать старые функции маршрутизации с использованием импорта @angular/router-deprecated, но на данный момент мы должны использовать @angular/router).

  • @RouteConfig был изменен с помощью @Routes.

например: -

@Routes([
  {path: '/crisis-center', component: CrisisListComponent},
  {path: '/heroes',        component: HeroListComponent}
])

Ответ 2

2.0.0-alpha.36 (2015-08-31)

  • routerInjectables было переименовано в ROUTER_BINDINGS

2.0.0-alpha.41 (2015-10-13)

  • ROUTER_BINDINGS был переименован в ROUTER_PROVIDERS

ИСПОЛЬЗОВАТЬ ROUTER_PROVIDERS

ROUTER_PROVIDERS используется для упрощения начальной загрузки маршрутизатора.

Он включает в себя:

  • RouterRegistry - сбор зарегистрированных маршрутов
  • LocationStrategy = PathLocationStrategy - соответствие по пути

ROUTER_PROVIDERS предоставляет "нормальные" значения по умолчанию и должен использоваться, если вам не нужен другой маршрут LocationStrategy.

Изменить:

bootstrap(DashboardAppComponent);

To:

bootstrap(DashboardAppComponent, [
  ROUTER_PROVIDERS
]);

Источники:


2.0.0-alpha.38 (2015-10-03)

Атрибуты маршрута должны быть CamelCase (технически PascalCase)

Примечание: это уже упоминалось в ответе Пардипа под № 3

Если вы хотите включить ссылку на маршрут в своем шаблоне через router-link, вы должны убедиться, что псевдоним (т.е. свойство name) маршрута - PascalCase.

Если вы используете план использования router-link, измените маршрут на:

{ path: '/employees', component: EmployeesComponent, name: 'Employees'}

Затем вы можете добавить ссылку в свой шаблон с помощью:

<a [router-link]="['/Employees']">Employees Link</a>

RouterLink динамически вставляет href, который соответствует пути маршрута.

Примечание. При чтении проблемы /pr это изменение было сделано для того, чтобы пользователи не путали привязку <route-link> с URL-адресом маршрута

Источники:

Совет:

Если вы хотите упростить директивы просмотра, используйте ROUTER_DIRECTIVES

Он включает в себя:

  • RouterLink
  • RouterOutlet

Update:

В ближайшем будущем RouterOutlet/<router-outlet> будет переименован в RouterViewport/<router-viewport>

Источник:

Обновление 2:

  • Свойство RouteConfig as было переименовано в name

Источник:

Ответ 3

Ответ на 23 декабря 2016 года (Angular v2.4.1, Router v3.4.1 - должен работать для любого NG v2.x.x + Router v3.x.x)

Я просто перенес три из наших приложений из семплы Webpack Starter Seed в Angular CLI (v1.0.0-beta.24) и ударил эту проблему.

Требуется только небольшая часть того, что на странице NG 2 массивная страница документа-маршрутизатора:

Файл app-routing.module.ts (обычно в src/app/folder), похожий на этот образец:

import { NgModule }              from '@angular/core';
import { RouterModule, Routes }  from '@angular/router';

const appRoutes: Routes = [
  { path: '', component: YourHomePageComponent },
  { path: 'next-page',   component: NextComponent }
];

@NgModule({
  imports: [
    RouterModule.forRoot(appRoutes)
  ],
  exports: [
    RouterModule
  ]
})
export class AppRoutingModule {}

Импортировать AppRoutingModule в основной модуль (обычно src/app/app.module.ts):

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule,
    AppRoutingModule  // <--- The import you need to add
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

Убедитесь, что у вас есть <router-outlet></router-outlet> где-то в главном html (часто src/app/app.component.html), так как здесь вводится содержимое маршрутизатора.

Ответ 4

Убедитесь, что маршрутизатор определен и указан в AppModule. Пример (смотрите везде, где указана маршрутизация, игнорируйте остальные):

app.routing.ts

import { ModuleWithProviders }  from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

import { HeroesComponent }      from './heroes.component';
import {DashboardComponent} from './dashboard.component';
import {HeroDetailComponent} from './hero-detail.component';

const appRoutes: Routes = [
  {
    path: 'heroes',
    component: HeroesComponent
  },
  {
  path: 'dashboard',
  component: DashboardComponent
},
{
  path: '',
  redirectTo: '/dashboard',
  pathMatch: 'full'
},
{
  path: 'detail/:id',
  component: HeroDetailComponent
},
];

export const routing: ModuleWithProviders = RouterModule.forRoot(appRoutes);

и app.module.ts:

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

// Imports for loading & configuring the in-memory web api
import { InMemoryWebApiModule } from 'angular-in-memory-web-api';


import { AppComponent }         from './app.component';
import { DashboardComponent }   from './dashboard.component';
import { HeroesComponent }      from './heroes.component';
import { HeroDetailComponent }  from './hero-detail.component';
import { HeroService }          from './hero.service';
import { routing }              from './app.routing';
import './rxjs-extensions';
import {HeroSearchComponent} from './hero-search.component';

@NgModule({
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule,

    routing
  ],
  declarations: [
    AppComponent,
    DashboardComponent,
    HeroDetailComponent,
    HeroesComponent,
    HeroSearchComponent
  ],
  providers: [
    HeroService,
  ],
  bootstrap: [ AppComponent ]
})
export class AppModule {
}

Ответ 5

Это может спасти кого-то час:

Вы получаете эту ошибку, если даже не используете маршрутизацию (например, временную, возможно, вы не импортируете конфигурацию маршрутизации, а маршрутизатор-выход закомментирован), но вы используете Router или ActivatedRoute в некоторых конструкторах компонентов через инъекцию зависимости, вот так:

@Component({...}})
export class SomeComponent {
constructor(private _router: Router, private _route: ActivatedRoute) {
//may be you are not using _route/_route at the moment at all!
}
...
}

Ответ 6

Вы не можете использовать Injection для зависимостей для Router, если вы не определяете какие-либо маршруты! Чтобы определить пользователя маршрута, что-то похожее на следующие коды:

const loginRoutes: Routes = [
    {path: 'foo/bar/baz', component: 'MyRootComponent'}
];

@NgModule({
    imports:      [
        BrowserModule,
        FormsModule,
        HttpModule,
        JsonpModule,
        RouterModule.forRoot(loginRoutes)
    ],
    providers:    [],
    declarations: [
        MyLoginComponent
    ],
    bootstrap:    [
        MyLoginComponent
    ]
})

export class MyLoginModule
{
}