Angular 2 Router ohne Basis-Href-Set


195

Ich erhalte eine Fehlermeldung und kann nicht herausfinden, warum. Hier ist der Fehler:

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)

Weiß jemand, warum der Router dies auslöst? Ich benutze Angular2 Beta

Hier ist mein Code:

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 {
}

Antworten:


376

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

Fügen Sie das Basiselement direkt nach dem <head>Tag hinzu. Wenn der appOrdner wie für unsere Anwendung das Anwendungsstammverzeichnis ist, stellen Sie den hrefWert genau wie hier gezeigt ein.

Das <base href="https://stackoverflow.com/">teilt dem Angular-Router mit, was der statische Teil der URL ist. Der Router ändert dann nur den verbleibenden Teil der URL.

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

Alternativ hinzufügen

> = Angular2 RC.6

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

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

in Ihrem Bootstrap.

In älteren Versionen mussten die Importe so sein

<Angular2 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 : '/' });
]); 

<beta.17

import {APP_BASE_HREF} from 'angular2/router';

> = Beta.17

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

Siehe auch Location und HashLocationStrategy funktionieren in Beta.16 nicht mehr


3
Kleines Beispiel für den zweiten Weg:bootstrap(AppComponent, [ROUTER_PROVIDERS, provide(APP_BASE_HREF, {useValue : '/'})]);
malloc4k

1
Ich musste die Importzeile hinzufügen, um Provide verwenden import {provide} from 'angular2/core';zu können.
CorayThan

2
Ich musste lineimport {APP_BASE_HREF} from 'angular2/router';
jimmystormig

Danke für die Updates. Ich benutze TS nicht selbst (nur Dart) und meine TS-Kenntnisse sind immer noch begrenzt.
Günter Zöchbauer

1
Mein Projekt enthält SVG-Elemente, die mit Bildmustern gefüllt sind. Die Bilder wurden nie in Firefox angezeigt , wenn <base href="https://stackoverflow.com/" />in der Datei (für festgelegt wurde "/", "./", "#"oder jede andere Basispfad, unabhängig davon , wie die Bildpfade sich in dem Muster angegeben wurden). Die einzige Lösung, die schließlich funktionierte, war APP_BASE_HREFstattdessen zu verwenden . Ein echter Lebensretter!
ConnorsFan

34

Ich hatte ein ähnliches Problem mit Angular4- und Jasmine-Unit-Tests. Die unten angegebene Lösung hat bei mir funktioniert

Fügen Sie die folgende Importanweisung hinzu

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

Fügen Sie die folgende Anweisung für die TestBed-Konfiguration hinzu:

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

11

Sie können auch die Hash-basierte Navigation verwenden, indem Sie Folgendes in app.module.ts aufnehmen

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

und indem Sie dem @NgModule Folgendes hinzufügen ({...})

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

Angular 2-Entwicklung mit TypeScript

„HashLocationStrategy - Der URL wird ein Hash-Zeichen (#) hinzugefügt, und das URL-Segment nach dem Hash identifiziert die Route, die als Webseitenfragment verwendet werden soll, eindeutig. Diese Strategie funktioniert mit allen Browsern, einschließlich der alten. “

Auszug aus: Yakov Fain Anton Moiseev. "Angular 2-Entwicklung mit TypeScript."


Danke Lionel! Dies ist ausgezeichnet und hat ein Problem gelöst, das ich mit der obigen APP_BASE_HREF-Lösung hatte und das bei Verwendung von URL-Parametern wie "product /: id" fehlschlägt. Vielen Dank!
Stokely


6

Es ist nur so, dass der folgende Code im head-Tag index.html hinzugefügt wird

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

das hat für mich wie ein Zauber gewirkt.


5

Mit Angular 4 können Sie dieses Problem beheben, indem Sie die Datei app.module.ts wie folgt aktualisieren :

Fügen Sie die Importanweisung oben wie folgt hinzu:

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

Und fügen Sie die folgende Zeile hinzu @NgModule

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

Reff: https://angular.io/api/common/APP_BASE_HREF


Warum muss useValue '/ my / app' sein?
Dilip Nannaware

5

Angular 7,8 Fix befindet sich in app.module.ts

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

innerhalb von @NgModule hinzufügen

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


Ich habe diesen Fehler festgestellt, als ich versucht habe, eine Komponente für ein eckiges Storybook zu laden. Diese Komponente war vom Router abhängig. Es hat den Fehler behoben !!
Arpan Banerjee

1

Überprüfen Sie Ihre index.html. Wenn Sie das folgende Teil versehentlich entfernt haben, fügen Sie es hinzu, und es ist in Ordnung

<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">
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.