Obviamente, a versão beta do Angular2 é mais nova que a nova, então não há muita informação por aí, mas estou tentando fazer o que acho que é um roteamento bastante básico.
A invasão com o código de início rápido e outros trechos do site https://angular.io resultou na seguinte estrutura de arquivo:
angular-testapp/
app/
app.component.ts
boot.ts
routing-test.component.ts
index.html
Com os arquivos sendo preenchidos da seguinte maneira:
index.html
<html>
<head>
<base href="/">
<title>Angular 2 QuickStart</title>
<link href="../css/bootstrap.css" rel="stylesheet">
<!-- 1. Load libraries -->
<script src="node_modules/angular2/bundles/angular2-polyfills.js"></script>
<script src="node_modules/systemjs/dist/system.src.js"></script>
<script src="node_modules/rxjs/bundles/Rx.js"></script>
<script src="node_modules/angular2/bundles/angular2.dev.js"></script>
<script src="node_modules/angular2/bundles/router.dev.js"></script>
<!-- 2. Configure SystemJS -->
<script>
System.config({
packages: {
app: {
format: 'register',
defaultExtension: 'js'
}
}
});
System.import('app/boot')
.then(null, console.error.bind(console));
</script>
</head>
<!-- 3. Display the application -->
<body>
<my-app>Loading...</my-app>
</body>
</html>
boot.ts
import {bootstrap} from 'angular2/platform/browser'
import {ROUTER_PROVIDERS} from 'angular2/router';
import {AppComponent} from './app.component'
bootstrap(AppComponent, [
ROUTER_PROVIDERS
]);
app.component.ts
import {Component} from 'angular2/core';
import {RouteConfig, ROUTER_DIRECTIVES, ROUTER_PROVIDERS, LocationStrategy, HashLocationStrategy} from 'angular2/router';
import {RoutingTestComponent} from './routing-test.component';
@Component({
selector: 'my-app',
template: `
<h1>Component Router</h1>
<a [routerLink]="['RoutingTest']">Routing Test</a>
<router-outlet></router-outlet>
`
})
@RouteConfig([
{path:'/routing-test', name: 'RoutingTest', component: RoutingTestComponent, useAsDefault: true},
])
export class AppComponent { }
routing-test.component.ts
import {Component} from 'angular2/core';
import {Router} from 'angular2/router';
@Component({
template: `
<h2>Routing Test</h2>
<p>Interesting stuff goes here!</p>
`
})
export class RoutingTestComponent { }
Tentar executar este código produz o erro:
EXCEPTION: Template parse errors:
Can't bind to 'routerLink' since it isn't a known native property ("
<h1>Component Router</h1>
<a [ERROR ->][routerLink]="['RoutingTest']">Routing Test</a>
<router-outlet></router-outlet>
"): AppComponent@2:11
Encontrei um problema vagamente relacionado aqui; Diretivas de link de roteador quebradas após a atualização para angular2.0.0-beta.0 . No entanto, o "exemplo de trabalho" em uma das respostas é baseado no código pré-beta - que ainda pode funcionar, mas eu gostaria de saber por que o código que criei não está funcionando.
Qualquer ponteiro seria recebido com gratidão!
directives: [ROUTER_DIRECTIVES]
.@Component({selector: "app"}) @View({templateUrl: "app.html", directives: [ROUTER_DIRECTIVES, RouterLink]})
directives: [ROUTER_DIRECTIVES]
e a alteração de [router-link] para [routerLink], não estou mais recebendo o erro.Respostas:
> = RC.5
importe o
RouterModule
Consulte também https://angular.io/guide/router> = RC.2
app.routes.ts
main.ts
<= RC.1
Seu código está ausente
Você não pode usar diretivas como
routerLink
ourouter-outlet
sem divulgá-las ao seu componente.Embora os nomes das diretivas tenham sido alterados para fazer distinção entre maiúsculas e minúsculas no Angular2, os elementos ainda usam
-
o nome como<router-outlet>
compatíveis com as especificações de componentes da web que requerem a-
no nome de elementos personalizados.registrar globalmente
Para disponibilizar
ROUTER_DIRECTIVES
globalmente, adicione este provedor abootstrap(...)
:não é mais necessário adicionar
ROUTER_DIRECTIVES
a cada componente.fonte
provide(PLATFORM_DIRECTIVES, {useValue: [ROUTER_DIRECTIVES, FORM_DIRECTIVES, ETC...], multi: true})
FORM_DIRECTIVES
estão incluídosPLATFORM_DIRECTIVES
por padrão.Para pessoas que encontram isso ao tentar executar testes porque via
npm test
oung test
usam o Karma ou qualquer outra coisa. Seu módulo .spec precisa de uma importação especial de teste de roteador para poder construir.http://www.kirjai.com/ng2-component-testing-routerlink-routeroutlet/
fonte
spec
arquivo que eu tinha que adicionar isso. Obrigado @raykrow!RouterModule
, então você precisa chamarforRoot
para satisfazer o módulo e, em seguida, você deve fornecer oBASE_HREF
e ...Can't bind to 'active' since it isn't a known property of 'a'.
em vários dos meus testes de unidade e importadoRouterTestingModule
.Palavra de cautela ao codificar com o Visual Studio (2013)
Eu perdi 4 a 5 horas tentando depurar esse erro. Tentei todas as soluções que encontrei no StackOverflow pela letra e ainda recebi este erro:
Can't bind to 'routerlink' since it isn't a known native property
Esteja ciente de que o Visual Studio tem o hábito desagradável de formatação automática de texto quando você copia / cola código. Eu sempre recebi um pequeno ajuste instantâneo do VS13 (a caixa de camelo desaparece).
Este:
Torna-se:
É uma pequena diferença, mas o suficiente para acionar o erro. A parte mais feia é que essa pequena diferença ficava evitando a minha atenção toda vez que eu copiava e colava. Por mero acaso, vi essa pequena diferença e a resolvi.
fonte
Para> = V5
componente:
Para <V5
Também pode usar
RouterLink
como umdirectives
ie.directives: [RouterLink]
. isso funcionou para mimfonte
Em geral, sempre que você recebe um erro como esse
Can't bind to 'xxx' since it isn't a known native property
, a causa mais provável é esquecer de especificar um componente ou uma diretiva (ou uma constante que contenha o componente ou a diretiva) nadirectives
matriz de metadados. Esse é o caso aqui.Como você não especificou
RouterLink
ou a constanteROUTER_DIRECTIVES
- que contém o seguinte :- na
directives
matriz, quando Angular analisanão conhece a diretiva RouterLink (que usa o seletor de atributos
routerLink
). Como o Angular sabe qual é oa
elemento, ele assume que[routerLink]="..."
é uma ligação de propriedade para oa
elemento. Mas, em seguida, descobre querouterLink
não é uma propriedade nativa dosa
elementos, portanto, lança a exceção sobre a propriedade desconhecida.Eu realmente nunca gostei da ambiguidade da sintaxe . Ou seja, considere
Apenas olhando para o HTML, não podemos dizer se
whatIsThis
ésomething
something
Precisamos saber quais
directives: [...]
são especificados nos metadados do componente / diretiva para interpretar mentalmente o HTML. E quando esquecemos de colocar algo nadirectives
matriz, sinto que essa ambiguidade torna um pouco mais difícil a depuração.fonte
Você tem no seu módulo
você tem que exportar o módulo RouteModule
exemplo:
para poder acessar as funcionalidades de todos os que importam este módulo.
fonte
Eu tentei todos os métodos mencionados acima. Mas nenhum método funciona para mim. Finalmente, eu tenho a solução para o problema acima e está funcionando para mim.
Eu tentei este método:
Em HTML:
No arquivo TS:
fonte
No meu caso, importei o RouterModule no módulo App, mas não o importei no meu módulo de recursos. Depois de importar o módulo roteador no meu EventModule, o erro desaparece.
fonte
Se receber este erro durante o teste de unidade, escreva-o.
fonte
Eu realmente aprecio a resposta de @ raykrow quando alguém tem esse problema apenas em um arquivo de teste! Foi aí que eu o encontrei.
Como geralmente é útil ter outra maneira de fazer algo como backup, eu queria mencionar essa técnica que também funciona (em vez de importar
RouterTestingModule
):(Normalmente, alguém usaria
routerLink
em um<a>
elemento, mas ajustaria o seletor de acordo com outros componentes.)A segunda razão pela qual eu quis mencionar essa solução alternativa é que, embora ela tenha me servido bem em vários arquivos de especificação, tive um problema com ela em um caso:
Eu não conseguia entender como esse mock e meu
ButtonComponent
estavam usando o mesmo seletor; portanto, procurar uma abordagem alternativa me levou aqui à solução da @ raykrow.fonte
Se você usa módulos compartilhados, basta adicionar RouterModule a um módulo em que seu componente é declarado e não se esqueça de adicionar
<router-outlet></router-outlet>
Referenciado a partir daqui, o RouterLink não funciona
fonte
Minha solução é simples. Estou usando [href] em vez de [routerLink]. Eu tentei todas as soluções para [routerLink]. Nenhum deles funciona no meu caso.
Aqui está a minha solução:
Em seguida, escreva a
getPlanUrl
função no arquivo TS.fonte