当前位置:  开发笔记 > 编程语言 > 正文

Angular2异常:无法绑定到'routerLink',因为它不是已知的本机属性

如何解决《Angular2异常:无法绑定到'routerLink',因为它不是已知的本机属性》经验,为你挑选了6个好方法。

显然,Angular2的测试版比新版更新,因此没有太多的信息,但我正在尝试做我认为是一些相当基本的路由.

使用https://angular.io网站上的快速入门代码和其他代码片段进行黑客攻击导致了以下文件结构:

angular-testapp/
    app/
        app.component.ts
        boot.ts
        routing-test.component.ts
    index.html

文件填充如下:

的index.html



  
    
    Angular 2 QuickStart
    

    
    
    
    
    
    

    
    

  

  
  
    Loading...
  


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: `
        

Component Router

Routing Test ` }) @RouteConfig([ {path:'/routing-test', name: 'RoutingTest', component: RoutingTestComponent, useAsDefault: true}, ]) export class AppComponent { }

路由test.component.ts

import {Component} from 'angular2/core';
import {Router} from 'angular2/router';

@Component({
    template: `
        

Routing Test

Interesting stuff goes here!

` }) export class RoutingTestComponent { }

尝试运行此代码会产生错误:

EXCEPTION: Template parse errors:
Can't bind to 'routerLink' since it isn't a known native property ("
        

Component Router

][routerLink]="['RoutingTest']">Routing Test "): AppComponent@2:11

我在这里发现了一个模糊的相关问题; 升级到angular2.0.0-beta.0后,router-link指令被破坏.但是,其中一个答案中的"工作示例"是基于pre-beta代码 - 这可能仍然有效,但我想知道为什么我创建的代码不起作用.

任何指针都会感激不尽!



1> Günter Zöchb..:

> = RC.5

导入RouterModule 请参阅https://angular.io/guide/router

@NgModule({ 
  imports: [RouterModule],
  ...
})

> = RC.2

app.routes.ts

import { provideRouter, RouterConfig } from '@angular/router';

export const routes: RouterConfig = [
  ...
];

export const APP_ROUTER_PROVIDERS = [provideRouter(routes)];

main.ts

import { bootstrap } from '@angular/platform-browser-dynamic';
import { APP_ROUTER_PROVIDERS } from './app.routes';

bootstrap(AppComponent, [APP_ROUTER_PROVIDERS]);

<= RC.1

你的代码丢失了

  @Component({
    ...
    directives: [ROUTER_DIRECTIVES],
    ...)}

您不能使用routerLink或不使用router-outlet组件已知的指令.

虽然在Angular2中将指令名称更改为区分大小写,但元素仍然-在名称中使用,以便与需要-自定义元素名称的Web组件规范兼容.

全球注册

要使ROUTER_DIRECTIVES全局可用,请将此提供程序添加到bootstrap(...):

provide(PLATFORM_DIRECTIVES, {useValue: [ROUTER_DIRECTIVES], multi: true})

然后不再需要添加ROUTER_DIRECTIVES到每个组件.


这很棒,谢谢.在尝试将它们放在一起时,我也发现这很有用:http://stackoverflow.com/questions/34391790/globally-register-a-directive-in-angular2

2> rayepps..:

对于那些在尝试运行测试时发现这种情况的人,因为通过npm testng test使用Karma或其他任何东西.您的.spec模块需要一个特殊的路由器测试导入才能构建.

import { RouterTestingModule } from '@angular/router/testing';

  TestBed.configureTestingModule({
    imports: [RouterTestingModule],
    declarations: [AppComponent],
  });

http://www.kirjai.com/ng2-component-testing-routerlink-routeroutlet/


这是一个很好的抓住!我的项目没有正常操作的任何问题,我必须在`spec`文件中添加它.谢谢@raykrow!

3> Adrian Moisa..:

使用Visual Studio编码时要小心谨慎(2013)

我浪费了4到5个小时试图调试此错误.我尝试了通过信件在stackoverflow上找到的所有解决方案,但我仍然遇到此错误:Can't bind to 'routerlink' since it isn't a known native property

请注意,当您复制/粘贴代码时,Visual Studio具有令人讨厌的自动编码文本.我总是从VS13得到一个小的瞬间调整(骆驼情况消失).

这个:


变为:


这是一个小差异,但足以触发错误.最丑陋的部分是,每次复制和粘贴时,这种小差异都会让我不再注意.凭借纯粹的机会,我看到了这个小小的差异并解决了它.


谢谢,您可以提到"routerlink"与"routerLink"之间的区别.Angular 2期望"routerLink"出现,但找到"routerlink"

4> Shaishab Roy..:

对于> = V5

import { RouterModule, Routes } from '@angular/router';

const appRoutes: Routes = [
  {path:'routing-test', component: RoutingTestComponent}
];

@NgModule({
  imports: [
    RouterModule.forRoot(appRoutes)
    // other imports here
  ]
})

零件:

@Component({
    selector: 'my-app',
    template: `
        

Component Router

Routing Test ` })

对于

也可以RouterLink用作directivesie.directives: [RouterLink].这对我有用

import {Router, RouteParams, RouterLink} from 'angular2/router';

@Component({
    selector: 'my-app',
    directives: [RouterLink],
    template: `
        

Component Router

Routing Test ` }) @RouteConfig([ {path:'/routing-test', name: 'RoutingTest', component: RoutingTestComponent, useAsDefault: true}, ])



5> Mark Rajcok..:

通常,每当出现类似错误时Can't bind to 'xxx' since it isn't a known native property,最可能的原因是忘记在directives元数据数组中指定组件或指令(或包含组件或指令的常量).这就是这种情况.

由于您没有指定RouterLink或常量ROUTER_DIRECTIVES- 其中包含以下内容:

export const ROUTER_DIRECTIVES = [RouterOutlet, RouterLink, RouterLinkWithHref, 
  RouterLinkActive];

- 在directives数组中,然后当Angular解析时

Routing Test

它不知道RouterLink指令(使用属性选择器routerLink).由于Angular确实知道a元素是什么,因此它假定它[routerLink]="..."是元素的属性绑定a.但它然后发现它routerLink不是a元素的本机属性,因此它抛出了有关未知属性的异常.


我从来没有真正喜欢语法的模糊性.即,考虑一下


只要看一眼的HTML,我们不能告诉我们,如果whatIsThis

一个本地财产 something

指令的属性选择器

输入属性 something

我们必须知道directives: [...]在组件的/指令的元数据中指定了哪些,以便在心理上解释HTML.当我们忘记在directives数组中添加某些内容时,我觉得这种模糊性会让调试变得更加困难.



6> alehn96..:

你有你的模块

import {Routes, RouterModule} from '@angular/router';

你必须导出模块RouteModule

例:

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})

能够访问导入此模块的所有人的功能.

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有