构建错误
常见的错误
忘记装饰师的括号
装饰器应该有括号
()
在注释之后。一些例子包括:
@injectable()
那
@可选的()
那
@输入()
, 等等。
@
指示
(
{
选择器
:
'我的dir'
}
的)
班级
言论自说
{
//错误,应该是@optional()
// @optional在此处都不做,所以如果父级未定义,则表示MyDirective会错误
构造函数
(
@optional父母
:
parentcomponent.
的)
{
}
}
常见错误
无法解决所有参数
无法解决所有参数
为了
'你的班'
(
还
的)
。确保所有参数都以注入或有效装饰
类型
注释和那个
'你的班'
装饰有注射的。
此异常意味着角度对一个或多个参数混淆
你的班
'建设者。为了做
依赖注入
角度需要知道要注入参数的类型。通过指定参数的类来允许Angular知道这一点。确保:
- 您正在导入参数的类。
- 您已正确注释参数或指定其类型。
进口
{
myservice.
}
从
'我的服务'
;
//别忘了进口我!
@
零件
(
{
模板
:
`
你好世界
`
}
的)
出口
班级
我的课
{
//服务是myservice类型
构造函数
(
服务
:
myservice.
的)
{
}
}
有时,您的代码中的循环引用可能会导致此错误。循环引用意味着两个对象彼此相互依赖,因此没有办法彼此之前申报。要解决这个问题,我们可以使用
forward
功能内置于角度。
进口
{
forward
}
从
'@ Angular / Core'
;
@
零件
(
{
选择器
:
'我的按钮'
那
模板
:
`
<图标> 图标> <输入类型=“按钮”/> div>
`
那
指令
:
[
forward
(
(
的)
=>
米西昂
的)
]
//毫无遗留尚未定义
}
的)
// forwardref在需要Myicon时将其作为Myicon解析为MyIcon
班级
myButton.
{
构造函数
(
的)
{
}
}
@
指示
(
{
选择器
:
'图标'
}
的)
班级
米西昂
{
构造函数
(
ContainerButton.
:
myButton.
的)
{
}
//已定义mybutton
}
复制
复制
没有paramtype提供商
没有提供者
为了
paramtype.
!
(
我的课 -
>
paramtype.
的)
这意味着Angular知道它应该注入的参数类型,但它不知道如何注入它。
如果参数是服务,请确保已将指定的类添加到应用程序可用的提供程序列表中:
进口
{
myservice.
}
从
'我的服务'
;
@
零件
(
{
templateURL.
:
'app / app.html'
那
提供者
:
[
myservice.
]
//别忘了我!
}
的)
班级
myapp.
{
}
复制
复制
如果参数是另一个组件或指令(例如,父组件),将其添加到提供程序列表中会使错误消失,但这将具有与此相同的效果
多个提供者实例
更多。您将创建组件类的新实例,并且您将无法参考所需的组件实例。相反,确保您希望注入的指令或组件可供您的组件(例如,如果您期望成为父母,它实际上是一个父级)。这可能更容易理解一个例子:
@
零件
(
{
选择器
:
'我的comp'
那
模板
:
' p>'
那
指令
:
[
forward
(
(
的)
=>
迈德尔
的)
]
}
的)
班级
my
{
构造函数
(
的)
{
这
。
姓名
=
'我的组件'
;
}
}
@
指示
(
{
选择器
:
'[我的dir]'
}
的)
班级
迈德尔
{
构造函数
(
C
:
my
的)
{
// < - 这是兴趣线
//指令在常规div时错误,因为没有mycomp
//组件树,因此没有mycomp注入
安慰
。
日志
(
'主机组件的名称:'
+
C
。
姓名
的)
;
}
}
@
零件
(
{
模板
:
“ my-comm>”
+
// MyDir构造函数没有错误,MyComp是MyDir的父级
“ my-comm>”
+
// mydir构造函数没有错误,mycomp是mydir的主机
“ div>”
那
// mydir构造函数中的错误
指令
:
[
my
那
迈德尔
]
}
的)
班级
myapp.
{
}
复制
复制
以下是说明注射器可用的图:
+ ------- + |App |+ --- + --- + |+ ------------------------- + ||+ ------ + ------ + + -------- + -------- + |div(mydir)||MyComp(MyDir)|< - Mycomp可以注射+ ------------- + + -------- + -------- + ^ | No MyComp to inject +------+------+ | P (MyDir) | <- MyComp can be injected from parent +-------------+
复制
复制
要在前面的示例中展开,您可以使用Angular
@可选的
注释如果您并不总是期望组件/指令参考:
@
指示
(
{
选择器
:
'[我的dir]'
}
的)
班级
迈德尔
{
构造函数
(
@
可选的
(
的)
C
:
my
的)
{
//如果c未定义,则不再错误
如果
(
C
的)
{
安慰
。
日志
(
`
主机组件的名称:
$ {
C
。
姓名
}
`
的)
;
}
}
}
复制
复制
无法绑定到“propertyname”,因为它不是已知属性
能
't绑定'
propertyname.
'因为它不是'
是一个已知的属性
'ElementName'
元素和没有相应属性的匹配指令
当您尝试并在没有该属性的元素上绑定属性时会发生这种情况。如果元素是组件或有一个或多个指令,则组件和指令都不具有该属性。
<! - div没有'foo'属性 - >
<
div
[Foo]
=
“
酒吧
“
>
div
>
复制
复制
没有ControlContainer的提供者
没有提供者
为了
ControlContainer.
!
(
ngcontrolname -
>
ControlContainer.
的)
此错误是更具体的版本
没有提供者
上面的错误。在不指定父母的情况下使用像NGControlName这样的表单控件时会发生这种情况
NGForm.
或ngformModel。在大多数情况下,可以通过确保您的表单控件在实际表单元素中来解决这方面。ngform使用
形式
作为选择器,因此这将实例化一个新的ngform:
@
零件
(
{
模板
:
'<表格>'
+
'<输入ngcontrol =“登录”>'
+
' form>'
}
的)
复制
复制
没有找到组件工厂
没有找到组件工厂
为了
<
组件名称
>
当您尝试使用未导入的组件,提供程序管道或指令并将其添加到NgModule时,会发生此错误。每当您添加新组件,提供程序,管道或指令到您的应用时,必须将其添加到
ngmodule.
在里面
src / app / app.module.ts
Angular的文件能够使用它。要修复此错误,您可以将违规组件,提供程序,管道或指令导入App.Module文件,然后如果它是提供程序将其添加到
提供者
数组和组件,管道或指令将其添加到声明数组中和
入学股关系
大批。
以前的
远程调试
下一个
运行时错误