Roteador Angular 2 sem conjunto href de base

195

Estou recebendo um erro e não consigo encontrar o porquê. Aqui está o erro:

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)

Alguém sabe por que o roteador está jogando isso? Estou usando angular2 beta

aqui está o meu código:

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 {
}
Jason Spick
fonte

Respostas:

376

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

Adicione o elemento base logo após a <head>tag. Se a apppasta for a raiz do aplicativo, como é para o nosso aplicativo, defina o hrefvalor exatamente como mostrado aqui.

O <base href="https://stackoverflow.com/">diz ao roteador Angular qual é a parte estática da URL. O roteador modifica apenas a parte restante da URL.

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

Como alternativa, adicione

> = Angular2 RC.6

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

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

no seu bootstrap.

Nas versões mais antigas, as importações tinham que ser como

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

Consulte também Location e HashLocationStrategy parou de funcionar na versão beta.16

Günter Zöchbauer
fonte
3
Pequeno exemplo de segunda maneira:bootstrap(AppComponent, [ROUTER_PROVIDERS, provide(APP_BASE_HREF, {useValue : '/'})]);
malloc4k
1
Eu tive que adicionar a linha de importação import {provide} from 'angular2/core';para poder usar o fornecer.
CorayThan
2
Eu tive que importar linhaimport {APP_BASE_HREF} from 'angular2/router';
jimmystormig 4/16/16
Obrigado pelas atualizações. Eu não uso TS sozinho (apenas Dart) e meu conhecimento sobre TS ainda é limitado.
Günter Zöchbauer 04/02
1
Meu projeto possui elementos SVG preenchidos com padrões de imagem. As imagens nunca foram exibidas no Firefox quando <base href="https://stackoverflow.com/" />foi definido no arquivo (para "/", "./", "#"ou qualquer outro caminho base, não importa como os caminhos de imagem próprios foram especificados no padrão). A única solução que finalmente funcionou foi usar em seu APP_BASE_HREFlugar. Um salva-vidas da vida real!
ConnorsFan
34

Eu havia enfrentado um problema semelhante com os testes de unidade Angular4 e Jasmine; abaixo dada solução funcionou para mim

Adicionar declaração de importação abaixo

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

Adicione a instrução abaixo para a configuração TestBed:

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

Você também pode usar a navegação baseada em hash incluindo o seguinte em app.module.ts

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

e adicionando o seguinte ao @NgModule ({...})

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

Desenvolvimento Angular 2 com TypeScript

“HashLocationStrategy - Um sinal de hash (#) é adicionado ao URL e o segmento de URL após o hash identifica exclusivamente a rota a ser usada como um fragmento de página da web. Essa estratégia funciona com todos os navegadores, incluindo os antigos. ”

Trecho de: Yakov Fain Anton Moiseev. "Desenvolvimento Angular 2 com TypeScript."

Lionel Morrison
fonte
Obrigado Lionel! Isso é excelente e resolveu um problema que tive usando a solução APP_BASE_HREF acima, que falha ao usar parâmetros de URL como "product /: id". Obrigado!
Stokely 25/03
8

Desde 2.0 beta :)

import { APP_BASE_HREF } from 'angular2/platform/common';
Machado de Fogo
fonte
A partir de RC6 isso é tudo no provedor de agora: angular.io/docs/ts/latest/api/common/index/...
Mark Kenny
1
Isso me ajudou quando minhas especificações no Karma estavam falhando com o Erro: Sem base href definida. Forneça um valor para o token APP_BASE_HREF ou adicione um elemento base ao documento.
Alinhado
6

basta adicionar o código abaixo na tag index.html head

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

isso funcionou como um encanto para mim.

naram kiran
fonte
5

Com o angular 4, você pode corrigir esse problema atualizando o arquivo app.module.ts da seguinte maneira:

Adicione a declaração de importação na parte superior, como abaixo:

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

E adicione abaixo da linha dentro @NgModule

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

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

Suresh Kamrushi
fonte
Por que useValue precisa ser '/ my / app'?
Dilip Nannaware
5

A correção angular 7,8 está em app.module.ts

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

add no @NgModule

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

Feng Zhang
fonte
Eu enfrentei esse erro ao tentar carregar um componente para um livro de histórias angular. Este componente tinha dependência do roteador. Resolveu o erro !!
Arpan Banerjee
1

Verifique seu index.html. Se você removeu acidentalmente a parte a seguir, inclua-a e ela ficará bem

<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">
Tadele Ayelegn
fonte