在Angular 2 RC.5中,我无法找到上述错误的修复:
Unhandled Promise rejection: Template parse errors:
No provider for FormGroupDirective ("p>Custom begin </p>
<p>Host contains {{hostFormGroup.directives.length}} directives</p>
[ERROR ->]<nested></nested>
<p>Custom end </p>
</div>
"): CustomComponent@4:6 ; Zone: <root> ; Task: Promise.then ; Value:
当嵌套在另一个自定义组件中的自定义组件依赖于包含@Host() hostFormGroup: FormGroupDirective
时,会发生。
此处显示了该情景plunker。 AppComponent 显示一个响应/模型驱动的表单(暂时没有控件,但此时并不重要)包含 CustomComponent ,而后者又有一个 > NestedComponent 。有关错误详细信息,请参阅开发者控制台。
第一级自定义组件可以依赖托管 FormGroupDirective ,但不会影响该问题。如果它具有依赖性,则可以正确解析。第二级自定义组件也不会发生同样的情况,无论第一级组件是什么。
如果在 AppComponent 中直接使用相同的 NestedComponent ,问题就会消失。
我错过了什么? TA
这是代码的主要部分,供参考:
import { Component, Host } from '@angular/core';
import {
REACTIVE_FORM_DIRECTIVES, FormBuilder,
FormGroup, FormGroupDirective
} from '@angular/forms';
///////////////////////
// Nested
@Component({
selector: 'nested',
template: `
Nested begin<br/>
Nested end <br/>
`,
})
class NestedComponent {
constructor(
@Host() private hostFormGroup: FormGroupDirective) {
}
}
///////////////////////
// Custom
@Component({
selector: 'custom',
template: `
Custom begin <br/>
<nested></nested> <br/>
Custom end <br/>
`,
directives: [NestedComponent],
})
class CustomComponent {
constructor(
@Host() private hostFormGroup: FormGroupDirective) {
}
}
///////////////////////
// App
@Component({
selector: 'my-app',
template: `
<h1>Angular 2 - @Host() issue</h1>
<form [formGroup]="mainForm" accept-charset="UTF-8" role="form">
<fieldset>
<custom></custom>
</fieldset>
</form>
`,
directives: [REACTIVE_FORM_DIRECTIVES, CustomComponent],
})
export class AppComponent {
constructor(formBuilder: FormBuilder) {
this.mainForm = formBuilder.group({});
}
}
答案 0 :(得分:0)
错误消息指向正确的方向。您需要声明FormGroupDirective
是提供者。即
@Component({
...
providers: [FormGroupDirective]
});
否则,您需要在更高级别声明它,例如在模块中,这样您就可以在模块范围内使用它。
答案 1 :(得分:0)
删除@Host()装饰器和额外的提供者,它可以工作。
@Component({
selector: 'nested',
template: `
<div>
<p>Nested begin </p>
<p>Host contains {{hostFormGroup.directives.length}} directives:</p>
<span *ngFor="let directive of hostFormGroup.directives">{{directive.name}}</span>
<p>Nested end </p>
</div>
`,
// tried this: no error, but injected one is not the actual container
// and it containes no directive
// without it: still same error 'No provider for FormGroupDirective'
//providers: [FormGroupDirective],
})
class NestedComponent {
constructor(
private hostFormGroup: FormGroupDirective) {
}
}
// Custom
@Component({
selector: 'custom',
template: `
<div>
<p>Custom begin </p>
<p>Host contains {{hostFormGroup.directives.length}} directives:</p>
<span *ngFor="let directive of hostFormGroup.directives">{{directive.name}}</span>
<nested></nested>
<p>Custom end </p>
</div>
`,
directives: [NestedComponent],
// tried this: still same error 'No provider for FormGroupDirective'
//providers: [FormGroupDirective],
})
class CustomComponent {
constructor(
private hostFormGroup: FormGroupDirective) {
}
}