Angular 6 Ошибка "NullInjectorError: Нет провайдера для маршрутизатора!"

В настоящее время я работаю над проектом, в котором мне нужно, чтобы пользователь заполнил угловую форму, а затем отправил ее на маршрут в моем бэкэнде для обработки данных. Бэкэнд находится в ASP.NET, и у меня уже есть функциональная форма в HTML, которая работает:

<body>
<h2 style = "text-align:center">Push notification test</h2>
<form style = "align-content:center" action = "SendPushNotification" method = "post">
    <div>
        <fieldset>
            <legend> Informations </legend>
            <label> Notification name : </label>
            <input name = "notificationName" id = "notificationName" type = "text" value = "Bonjour" />
        </fieldset>
        <br />
        <fieldset>
            <label> Server Key : </label>
            <input name = "serverKey" id = "serverKey" type = "text" value = "AAAAuTv1XVQ:APA91bHsgOmK-quki_rRehRhON9c_y9INocubgru6_jPePiE_Zt5iVXfJ-XD43RubfIY5WEoIpFEyziByfeNRsoIlpeNi693bGZYfjjb7ULDx23sRzHQcYLCgl7y3vn-K9X8hrmQhw1oY6lSTml2aqzoi8GGBIeZYA" />
        </fieldset>
        <br />
        <fieldset>
            <label> To mobile user : </label>
            <select name = "selectMobile" id = "selectMobile" style = "width:400px" name = "mobileUser">
                <option>Select Mobile User</option>
            </select>
        </fieldset>
        <br />
        <fieldset>
            <label> To topic : </label>
            <input name = "topicName" id = "topicName" type = "text" value = "news" />
        </fieldset>
        <br />
        <fieldset>
            <label> Message : </label>
            <textarea name = "notificationMessage" id = "notificationMessage" cols = "40" rows = "5">Comment tu vas toi ?</textarea>
        </fieldset>
        <br />
        <input type = "submit" value = "Send Notification" />
    </div>
</form>

HTML-рендеринг

Angular 6 Ошибка &quot;NullInjectorError: Нет провайдера для маршрутизатора!&quot;

Итак, я пытаюсь сделать то же самое в Angular 6 с этим результатом, но когда я хочу назначить маршрут «SendNotification» моей кнопке «Отправить», я получаю следующую ошибку:

Угловой рендеринг + ошибка

Angular 6 Ошибка &quot;NullInjectorError: Нет провайдера для маршрутизатора!&quot;

notification-form.component.html

<button [routerLink] = "['SendNotification']" type = "submit" class = "btn btn-success" [disabled] = "!notificationForm.form.valid">Submit</button>

Ошибка возникает, как только я добавляю [routerLink] или добавляю приватный конструктор:

 constructor(private router: Router) {}

на мой notification-form.component.ts. Я уже пробовал несколько решений, таких как добавление HttpClientModule к моему app.module.ts, но ничего не работает.

Что-то я делаю не так?

Заранее благодарим за уделенное время!

ОБНОВИТЬ:

app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms'; // <-- NgModel lives here
import { RouterModule } from '@angular/router';
import { HttpClientModule } from '@angular/common/http';

import { AppComponent } from './app.component';
import { NotificationFormComponent } from './notification-form/notification-form.component';

@NgModule({
  imports: [
BrowserModule,
HttpClientModule,
FormsModule,
RouterModule
],  
declarations: [
AppComponent,
NotificationFormComponent
],
providers: [],
bootstrap: [AppComponent]
})

export class AppModule { }

вы включили модуль маршрутизатора в app.module.ts?

brk 19.07.2018 11:56

Да, я обновлю позу с помощью app.module.ts

Fenouille 19.07.2018 11:59
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
14
2
51 725
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Вам нужно добавить <router-outlet></router-outlet>

Тег <router-outlet></router-outlet> - это место, где ваше приложение будет отображать различные маршруты. Например, в app.component.html вы можете иметь:

<header>
    <bt-toolbar></bt-toolbar>
</header>

<main>
    <router-outlet></router-outlet>
</main>

В этом шаблоне у меня всегда видна верхняя панель, а под ней - содержимое различных маршрутов.

Добавьте в свой app.module.ts это в массив импорта:

RouterModule.forRoot([
      { path: 'SendNotification', component: YourComponent }

Привет ! Куда мне это добавить?

Fenouille 19.07.2018 12:03

В случае, если кто-то использует ссылку (-ы) npm, следующую работу выполняет:

В .angular-cli.json добавить / заменить:

"defaults": {
    "styleExt": "css",
    "component": {},
    "build": {
        "preserveSymlinks": true
    }
}
Ответ принят как подходящий

Первый импорт RouteModule в app.module.ts

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

И используйте его, как показано ниже: (Вы импортируете только RouterModule, но также необходимо добавить forRoot([]).)

imports: [
    RouterModule.forRoot([])
    // other imports here
  ]

Если у вас есть маршруты, используйте их, как показано ниже. Этот пример кода из Угловой DOC

const appRoutes: Routes = [
  { path: 'crisis-center', component: CrisisListComponent },
  { path: 'hero/:id',      component: HeroDetailComponent },
  {
    path: 'heroes',
    component: HeroListComponent,
    data: { title: 'Heroes List' }
  },
  { path: '',
    redirectTo: '/heroes',
    pathMatch: 'full'
  },
  { path: '**', component: PageNotFoundComponent }
];

@NgModule({
  imports: [
    RouterModule.forRoot(
      appRoutes,
      { enableTracing: true } // <-- debugging purposes only
    )
    // other imports here
  ],
  ...
})
export class AppModule { }

И в вашем основном компоненте (app.component.html) добавьте <router-outlet></router-outlet>

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

Привет ! Спасибо за ваше время, я попробовал ваше решение, но теперь получаю эту ошибку: zone.js: 665 Отклонение необработанного обещания: не задано базовое href. Укажите значение токена APP_BASE_HREF или добавьте в документ базовый элемент. ; Зона: <корень>; Задача: Promise.then; Значение: Ошибка: не задано базовое значение href. Укажите значение токена APP_BASE_HREF или добавьте в документ базовый элемент.

Fenouille 19.07.2018 12:09

вы добавили <router-outlet></router-outlet> в app.component.html?

coder 19.07.2018 12:11

а также проверьте, что index.html имеет <base href = "/"> в теге head

coder 19.07.2018 12:12

Да, я добавил один, и в моем index.html есть один: /

Fenouille 19.07.2018 12:15

Да, я добавил его в свой _Layout.cshtml! Спасибо !

Fenouille 19.07.2018 12:27

Рад это слышать :)

coder 19.07.2018 12:28

Эй, ты спас мне день. Большое спасибо!

zs2020 02.12.2019 22:42

В моем случае я поставил только:

<base href = "/">

В моем теге head в файле index.html.

...
<head>
  ...
  <title>Name of page</title>
  <base href = "/">
</head>
...

Для тех, кто также борется с загадочными / бесполезными сообщениями об ошибках от компилятора Angular, убедитесь, что у вас где-то есть это:

RouterModule.forRoot([])

Я использовал только RouterModule.forChild([]), добавление forRoot () в один из модулей устранило ошибку.

Пожалуйста, проверьте эту ссылкуhttps://angular.io/api/router/RouterStateSnapshot

import { Component, OnInit } from '@angular/core';
import { RouterState, RouterStateSnapshot, Router } from '@angular/router'; 

@Component({
  templateUrl:'template.html'
})
export class MyComponent {
  constructor(router: Router) {
   const state: RouterState = router.routerState;
   const snapshot: RouterStateSnapshot = state.snapshot;
   console.info(state);
   console.info(snapshot);
   //...
 }
}

Если вы используете

RouterModule.forChild(routes)

попробуйте заменить на

RouterModule.forRoot(routes)

Другие вопросы по теме