Угловой маршрутизатор 2 без базового набора


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>

В качестве альтернативы добавьте

> = Angular2 RC.6

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

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

в твоей начальной загрузке.

В старых версиях импорт должен был быть как

<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';

> = бета.17

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

Смотрите также Location и 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 все еще ограничены.
Гюнтер Цохбауэр

1
В моем проекте есть элементы SVG, заполненные шаблонами изображений. Изображения никогда не отображаются в Firefox , когда <base href="https://stackoverflow.com/" />был установлено в файле (для "/", "./", "#"или любого другого базового пути, независимо от того , как сами пути изображений были указаны в шаблоне). Единственное решение, которое в итоге сработало, - это использовать APP_BASE_HREFвместо этого. Настоящий спасатель жизни!
ConnorsFan

34

Я сталкивался с подобной проблемой в модульных тестах Angular4 и Jasmine; ниже данное решение работало на меня

Добавить ниже заявление на импорт

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
      }
  ],
  ...
})

Разработка Angular 2 с использованием TypeScript

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

Отрывок из: Яков Файн, Антон Моисеев. «Разработка Angular 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
Это помогло мне, когда моя спецификация в Karma перестала работать с ошибкой: не задан базовый href. Пожалуйста, укажите значение для токена APP_BASE_HREF или добавьте базовый элемент в документ.
выровнен

6

просто добавьте приведенный ниже код в тег head index.html

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

это сработало как очарование для меня.


5

В angular 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

Исправление Angular 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.