我无法理解如何将主机组件CSS类传递给子元素。我创建了一个自定义元素:
...
const CUSTOM_INPUT_VALUE_PROVIDER: Provider = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => FormFieldComponent),
multi: true,
}
@Component({
moduleId: module.id,
changeDetection: ChangeDetectionStrategy.OnPush,
providers: [CUSTOM_INPUT_VALUE_PROVIDER],
selector: 'form-field',
template: `
<div>
<input
(change)="onChange($event.target.value)"
(blur)="onTouched()"
[disabled]="innerIsDisabled"
type="text"
[value]="innerValue" />
</div>
`
})
export class FormFieldComponent implements ControlValueAccessor {
@Input() innerValue: string;
innerIsDisabled: boolean = false;
onChange = (_) => {};
onTouched = () => {};
writeValue(value: any) {
if (value !== this.innerValue) {
this.value = value;
}
}
registerOnChange(fn: (_: any) => void): void { this.onChange = fn; }
registerOnTouched(fn: () => void): void { this.onTouched = fn; }
setDisabledState(isDisabled: boolean) {
this.innerIsDisabled = isDisabled;
}
get value(): any {
return this.innerValue;
}
set value(value: any) {
if (value !== this.innerValue) {
this.innerValue = value;
this.onChange(value);
}
}
}
然后以某种反应形式使用它:
<form-field formControlName="title"></form-field>
问题:我在FormBuilder
到title
表单控件中添加了一些验证,当它没有通过验证时,Angular将经典css类添加到form-field
元素: ng-pristine ng-invalid ng-touched
。
我如何将这个CSS类从host元素传递到form-field
组件中的输入元素?
与Angular 2 styling not applying to Child Component不重复。更改Encapsulation
无法解决问题。
答案 0 :(得分:1)
我认为通过了解托管元素的角度等级并且不一定要将它们传递下去,我们可以做任何你想要的事情。
如果是这样,你的解决方法在自定义表单元素的css中看起来像这样:
:host.(ng-class)>>>HTMLelement {
property: value
}
示例:
:host.ng-valid>>>div {
border-left: 5px solid #42a948;
}