在我们的4.3.2项目中,我们有一个指令,即各种类型的输入。其全部内容如下:指令现在导致“无法绑定到'模糊',因为它不是”输入“的已知属性。”
import { Directive, ElementRef, forwardRef, HostBinding, Renderer2 } from "@angular/core";
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from "@angular/forms";
const TRIM_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => TrimDirective),
multi: true
};
@Directive({
selector: 'input[type=text]:not(#autocomplete-keyboard-access):not([disabled]):not(.dropdown-box), input[type=email]',
providers: [TRIM_VALUE_ACCESSOR]
})
export class TrimDirective implements ControlValueAccessor {
onChange = (_: any) => {};
onTouched =() => {};
constructor(private renderer: Renderer2, private elementRef: ElementRef) {}
@HostBinding('blur')
blur() {
this.onTouched();
}
@HostBinding('change')
trim(value: any): void {
if (value) {
value = value.toString().trim();
}
this.writeValue(value);
this.onChange(value);
}
registerOnChange(fn: (value: any) => any): void { this.onChange = fn; }
registerOnTouched(fn:() => any): void { this.onTouched = fn; }
writeValue(value: any): void {
if (typeof value !== 'undefined') {
this.renderer.setProperty(this.elementRef.nativeElement, 'value', value);
}
}
}
它被导入到相关@NgModule
。同样,在NgModule.imports[]
中存在FormsModule
。
模板,我现在已经在模板下面的错误编译时(无论是在浏览器或AOT):
不能绑定到“模糊”,因为它不是一个已知的性质“输入”。
无论指令如何适用,都会引发错误。
有问题的模板(可追溯到的β-6天以来一直没有被重构):
<input #userEmail
name="email"
type="email"
class="modal-fixed-width-input" maxLength="128"
required
placeholder="[email protected]"
pattern="[a-z0-9._%+-][email protected][a-z0-9.-]+\.[a-z]{2,4}$"
[ngClass]="{'bg-yellow red' : !emailFocus && emailErrorMessage}"
[(ngModel)]="userMail"
(ngModelChange)="fieldsChange=true"
ngControl="email"
#email="ngModel"
(focus)="emailFocus=true"
(blur)="emailFocus=false; userEmail.value = userEmail.value.trim(); emailErrorMessage = isEntryValid(userEmail.value, 'Email');">
过渡到角CLI之前,该指令工作。由于FormsModule
被正确导入(这通常是对此错误的解释),我无法解释为什么此指令的事件侦听器绑定会导致此编译错误。
我可以说一些愚蠢,请原谅我。我想也许在hostbinding中存在名称冲突模糊。你可以测试@HostBinding('blur') onBlur(){.... – Vega
@Vega不是一个愚蠢的猜测,框架经常做这种名字绑定,但真正的问题在下面。 – msanford