Angular 4 无法绑定到 <property> 因为它不是 <component> 的已知属性
Posted
技术标签:
【中文标题】Angular 4 无法绑定到 <property> 因为它不是 <component> 的已知属性【英文标题】:Angular 4 Can't bind to <property> since it isn't a known property of <component> 【发布时间】:2017-08-25 04:01:06 【问题描述】:我正在尝试在 Angular 4 中创建自己的指令。但是,将类的属性绑定到组件模板时出现此错误。
控制台错误:
Unhandled Promise rejection: Template parse errors: Can't bind to
'data' since it isn't a known property of 'tree'. ("<tree [ERROR
->][data]="data"></tree>"):
我的树视图组件.ts:
@Component(
selector: 'app-tree-view',
template: '<tree [data]="data"></tree>'
)
export class TreeViewComponent implements OnInit
@Input() data: any[];
constructor()
this.data = [
label: 'a1',
subs: [
label: 'a11',
subs: [
label: 'a111',
subs: [
label: 'a1111'
,
label: 'a1112'
]
,
label: 'a112'
]
,
label: 'a12',
]
];
ngOnInit()
这是我的完整脚本文件:https://pastebin.com/hDyX2Kjj
有人知道吗?钛酸
【问题讨论】:
您不需要标记输入两次,`inputs: ['data'],` 或@Input()
如果两者都有,则一个是多余的。你把Node
加到declarations of
@NgModule()`了吗?
plnkr.co/edit/tpl:AvJOMERrnz94ekVua0u5 提供了一个现成的 Angular2 模板 - 只需按下“新建”按钮和“Angular”。
已通过在@NgModule() 中的声明数组中添加 TreeNodeComponent、TreeComponent、adn TreeViewComponent 来解决。有没有另一种方法只在 @NgModule() 中包含 TreeViewComponent 而没有 TreeNodeComponent 和 TreeComponent?因为我已经将它包含在 TreeViewComponent 中。
抱歉,我不知道您所说的“因为我已经将它包含在 TreeViewComponent 中”是什么意思。你的意思是TreeViewModule
?
我在 TreeComponent 中做了 import TreeNodeComponent from './tree-view.node.component';
,在 TreeViewComponent 中做了 import TreeComponent from './tree.component';
。为什么要在 app.module 中再次包含它们?仅仅在声明中包含 TreeViewComponent 还不够吗?
【参考方案1】:
每个组件、指令和管道都需要在@NgModule()
中注册
@NgModule(
declarations: [TreeViewComponent]
)
export class AppModule
更多详情见
https://angular.io/api/core/NgModule https://angular.io/guide/ngmodules https://angular.io/guide/ngmodule-api【讨论】:
tree.module.ts
: ' ... @NgModule( 声明:[ TreeNodeComponent, TreeComponent, TreeViewComponent ] ... ... ' 和app.module.ts
: ` 进口: [ . .. TreeModule ...]`可以吗?
是的,正如你的问题下面提到的,这通常是正确的方法,但对于还不熟悉@NgModule()
的人来说通常更难理解。但似乎你已经明白了;-)
@GünterZöchbauer:你能更新链接吗?当前链接已损坏。
@BhavikShah 感谢您的提示!已更新。【参考方案2】:
在为 ParentComponent 运行测试时,我遇到了同样的错误。里面是带有@Input 属性的 ChildComponent 组件:字符串;。 这两个组件也在 app.module.ts 中声明。
我已经这样修复了(父组件测试文件):
beforeEach(async(() =>
TestBed.configureTestingModule(
declarations: [ParentComponent, ChildComponent]// added child component declaration here
)
.compileComponents();
));
【讨论】:
【参考方案3】:正如 The Aelfinn 指出的那样,如果您跨模块使用组件,则需要将其导出。 但是你不应该在你想使用它的模块中导入、导出和声明它,因为它不是这个模块的一部分! 因此,假设您有一个 TreeViewStuffModule 声明了 TreeViewComponent 和一个 DoSomethingWithTreeViewModule 在其中使用了 TreeViewComponent,您的声明如下:
@NgModule(
declarations: [
TreeViewComponent
],
exports: [
TreeViewComponent
]
)
export class TreeViewStuffModule
@NgModule(
imports: [
TreeViewStuffModule
]
)
export class DoSomethingWithTreeViewModule
【讨论】:
【参考方案4】:如果您在另一个模块中使用 TreeViewComponent,则需要将组件导入到@NgModule
中,如下所示:
@NgModule(
imports: [TreeViewComponent],
// This says that all components in this module can import TreeViewComponent
exports: [ThisModulesComponents],
declarations: [ThisModulesComponents]
)
export class ModuleDependentOnTreeViewComponent
【讨论】:
你不应该在它不属于的其他模块中导入导出并声明组件以上是关于Angular 4 无法绑定到 <property> 因为它不是 <component> 的已知属性的主要内容,如果未能解决你的问题,请参考以下文章
Angular2:无法绑定到“formGroup”,因为它不是“form”的已知属性
Angular 2 错误:无法绑定到“innerhtml”,因为它不是已知的本机属性
在 Angular 4+ 中绑定到属性/函数与变量是否很糟糕?
在 Angular 中使用 cdkDropListData 时出错,我无法绑定到“cdkDropListData”,因为它不是“div”的已知属性