Кутовий 2 маршрутизатор без базового href


195

Я отримую помилку і не можу знайти причину. Ось помилка:

EXCEPTION: Error during instantiation of LocationStrategy! (RouterOutlet -> Router -> Location -> LocationStrategy).
    angular2.dev.js:23514 EXCEPTION: Error during instantiation of LocationStrategy! (RouterOutlet -> Router -> Location -> LocationStrategy).BrowserDomAdapter.logError @ angular2.dev.js:23514BrowserDomAdapter.logGroup @ angular2.dev.js:23525ExceptionHandler.call @ angular2.dev.js:1145(anonymous function) @ angular2.dev.js:14801NgZone._notifyOnError @ angular2.dev.js:5796collection_1.StringMapWrapper.merge.onError @ angular2.dev.js:5700run @ angular2-polyfills.js:141(anonymous function) @ angular2.dev.js:5719zoneBoundFn @ angular2-polyfills.js:111lib$es6$promise$$internal$$tryCatch @ angular2-polyfills.js:1511lib$es6$promise$$internal$$invokeCallback @ angular2-polyfills.js:1523lib$es6$promise$$internal$$publish @ angular2-polyfills.js:1494(anonymous function) @ angular2-polyfills.js:243microtask @ angular2.dev.js:5751run @ angular2-polyfills.js:138(anonymous function) @ angular2.dev.js:5719zoneBoundFn @ angular2-polyfills.js:111lib$es6$promise$asap$$flush @ angular2-polyfills.js:1305
    angular2.dev.js:23514 ORIGINAL EXCEPTION: No base href set. Please provide a value for the APP_BASE_HREF token or add a base element to the document.BrowserDomAdapter.logError @ angular2.dev.js:23514ExceptionHandler.call @ angular2.dev.js:1154(anonymous function) @ angular2.dev.js:14801NgZone._notifyOnError @ angular2.dev.js:5796collection_1.StringMapWrapper.merge.onError @ angular2.dev.js:5700run @ angular2-polyfills.js:141(anonymous function) @ angular2.dev.js:5719zoneBoundFn @ angular2-polyfills.js:111lib$es6$promise$$internal$$tryCatch @ angular2-polyfills.js:1511lib$es6$promise$$internal$$invokeCallback @ angular2-polyfills.js:1523lib$es6$promise$$internal$$publish @ angular2-polyfills.js:1494(anonymous function) @ angular2-polyfills.js:243microtask @ angular2.dev.js:5751run @ angular2-polyfills.js:138(anonymous function) @ angular2.dev.js:5719zoneBoundFn @ angular2-polyfills.js:111lib$es6$promise$asap$$flush @ angular2-polyfills.js:1305
    angular2.dev.js:23514 ORIGINAL STACKTRACE:BrowserDomAdapter.logError @ angular2.dev.js:23514ExceptionHandler.call @ angular2.dev.js:1157(anonymous function) @ angular2.dev.js:14801NgZone._notifyOnError @ angular2.dev.js:5796collection_1.StringMapWrapper.merge.onError @ angular2.dev.js:5700run @ angular2-polyfills.js:141(anonymous function) @ angular2.dev.js:5719zoneBoundFn @ angular2-polyfills.js:111lib$es6$promise$$internal$$tryCatch @ angular2-polyfills.js:1511lib$es6$promise$$internal$$invokeCallback @ angular2-polyfills.js:1523lib$es6$promise$$internal$$publish @ angular2-polyfills.js:1494(anonymous function) @ angular2-polyfills.js:243microtask @ angular2.dev.js:5751run @ angular2-polyfills.js:138(anonymous function) @ angular2.dev.js:5719zoneBoundFn @ angular2-polyfills.js:111lib$es6$promise$asap$$flush @ angular2-polyfills.js:1305
    angular2.dev.js:23514 Error: No base href set. Please provide a value for the APP_BASE_HREF token or add a base element to the document.
        at new BaseException (angular2.dev.js:8080)
        at new PathLocationStrategy (router.dev.js:1203)
        at angular2.dev.js:1380
        at Injector._instantiate (angular2.dev.js:11923)
        at Injector._instantiateProvider (angular2.dev.js:11859)
        at Injector._new (angular2.dev.js:11849)
        at InjectorDynamicStrategy.getObjByKeyId (angular2.dev.js:11733)
        at Injector._getByKeyDefault (angular2.dev.js:12048)
        at Injector._getByKey (angular2.dev.js:12002)
        at Injector._getByDependency (angular2.dev.js:11990)

Хтось знає, чому роутер кидає це? Я використовую бета-версію angular2

ось мій код:

import {Component} from 'angular2/core';
import { RouteConfig, ROUTER_DIRECTIVES } from 'angular2/router';
import {LoginComponent} from './pages/login/login.component';
import {DashboardComponent} from './pages/dashboard/dashboard.component';
@Component({
    selector: 'app',
    directives:[ROUTER_DIRECTIVES],
    template:`
        <div class="wrapper">
            <router-outlet></router-outlet>
        </div>`
})
@RouteConfig([
    { path: '/',redirectTo: '/dashboard' },
    { path: '/login',name:'login',component: LoginComponent },
    { path: '/dashboard',name:'dashboard',component: DashboardComponent,}
])
export class AppComponent {
}

Відповіді:


376

https://angular.io/docs/ts/latest/guide/router.html

Додайте базовий елемент відразу після <head>тегу. Якщо appпапка є коренем програми, як це стосується нашого додатку, встановіть hrefзначення точно так, як показано тут.

<base href="https://stackoverflow.com/">Каже Кутове маршрутизатор , що є статичною частиною URL. Тоді маршрутизатор лише змінює решту частини URL.

<head>
  <base href="/">
  ...
</head>

Альтернативно додати

> = Кутова2 RC.6

import {APP_BASE_HREF} from '@angular/common';

@NgModule({
  declarations: [AppComponent],
  imports: [routing /* or RouterModule */], 
  providers: [{provide: APP_BASE_HREF, useValue : '/' }]
]); 

у вашому завантажувальному закладі.

У старих версіях імпорт повинен був бути подібним

<Кутова2 RC.6

import {APP_BASE_HREF} from '@angular/common';
bootstrap(AppComponent, [
  ROUTER_PROVIDERS, 
  {provide: APP_BASE_HREF, useValue : '/' });
]); 

<RC.0

import {provide} from 'angular2/core';
bootstrap(AppComponent, [
  ROUTER_PROVIDERS, 
  provide(APP_BASE_HREF, {useValue : '/' });
]); 

<бета.17

import {APP_BASE_HREF} from 'angular2/router';

> = бета.17

import {APP_BASE_HREF} from 'angular2/platform/common';

Дивіться також Місце розташування та HashLocationStrategy припинили роботу в бета-версії.16


3
Маленький приклад другого способу:bootstrap(AppComponent, [ROUTER_PROVIDERS, provide(APP_BASE_HREF, {useValue : '/'})]);
malloc4k

1
Мені довелося додати рядок імпорту, import {provide} from 'angular2/core';щоб мати змогу використовувати.
CorayThan

2
Мені довелося імпортувати лініюimport {APP_BASE_HREF} from 'angular2/router';
jimmystormig

Дякуємо за оновлення Я не використовую TS (тільки Dart), і мої знання з TS поки обмежені.
Günter Zöchbauer

1
У моєму проекті є елементи SVG, наповнені візерунками зображень. Зображення ніколи не відображаються в Firefox , коли <base href="https://stackoverflow.com/" />був встановлено у файлі (для "/", "./", "#"або будь-якого іншого базового шляху, незалежно від того , як самі шляху зображень були вказані в шаблоні). Єдине рішення, яке, нарешті, спрацювало - це використовувати APP_BASE_HREFзамість цього. Справжнє рятівне життя!
ConnorsFan

34

Я зіткнувся з подібною проблемою з тестами Angular4 та Jasmine Unit; нижче дане рішення працювало на мене

Додати нижче імпорт імпорту

import { APP_BASE_HREF } from '@angular/common';

Додайте нижче конфігурацію для конфігурації TestBed:

TestBed.configureTestingModule({
    providers: [
        { provide: APP_BASE_HREF, useValue : '/' }
    ]
})

11

Ви також можете використовувати навігацію на основі хешу, включивши наступне в app.module.ts

import { LocationStrategy, HashLocationStrategy } from '@angular/common';

і додавши наступне до @NgModule ({...})

@NgModule({
  ...
  providers:    [
      ProductService, {
          provide: LocationStrategy, useClass: HashLocationStrategy
      }
  ],
  ...
})

Кутова розробка 2 з TypeScript

"HashLocationStrategy - до URL додається хеш-знак (#), а сегмент URL-адреси після хеша однозначно визначає маршрут, який використовуватиметься як фрагмент веб-сторінки. Ця стратегія працює з усіма браузерами, включаючи старі. "

Уривок: Яків Фаїн Антон Мойсеєв. «Кутова розробка 2 з TypeScript».


Дякую Ліонель! Це чудово і вирішило проблему, яку я мав за допомогою рішення APP_BASE_HREF, над яким не вдалося використовувати параметри URL-адреси, наприклад "product /: id". Дякую!
Стоклей

8

З 2.0 бета :)

import { APP_BASE_HREF } from 'angular2/platform/common';

Станом на Rc6, це все зараз у постачальника: angular.io/docs/ts/latest/api/common/index/…
Марк Кенні

1
Це допомогло мені, коли моя специфікація в Кармі зазнала невдачі з помилкою: не встановлено базовий href. Введіть значення для маркера APP_BASE_HREF або додайте базовий елемент до документа.
Вирівняно

6

це просто те, що додайте нижче код у головний тег index.html

   <html>
    <head>
     <base href="https://stackoverflow.com/">
      ...

що працювало як шарм для мене.


5

За допомогою кутового 4 ви можете вирішити цю проблему, оновивши файл app.module.ts таким чином:

Додайте заяву про імпорт зверху, як нижче:

import {APP_BASE_HREF} from '@angular/common';

І додайте нижче рядка всередину @NgModule

providers: [{provide: APP_BASE_HREF, useValue: '/my/app'}]

Посилання: https://angular.io/api/common/APP_BASE_HREF


Чому для useValue потрібно бути "/ my / app"?
Діліп Наннавер

5

Кутове виправлення 7,8 знаходиться в app.module.ts

import {APP_BASE_HREF} from '@angular/common';

всередині @NgModule додати

providers: [{provide: APP_BASE_HREF, useValue: '/'}]


Я зіткнувся з цією помилкою, намагаючись завантажити компонент для кутової книги оповідань. Цей компонент мав залежність від маршрутизатора. Це вирішило помилку !!
Арпан Банерджі

1

Перевірте свій index.html. Якщо ви випадково видалили наступну частину, включіть її, і це буде добре

<base href="https://stackoverflow.com/">

<meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.