所以我正在尝试制作一个可以操作FormControl的指令。
似乎如果我使用长语法来声明模板中的表单控件,我可以将控件传递给指令,以便将其作为直接@Input()绑定;即:使用以下模板:
<form [formGroup]="myForm">
<input type="text" id="myText" [formControl]="myForm.controls['myText']" my-directive>
</form>
以下组件逻辑:
@Component({
// Properties go here.
})
class MyComponent {
myForm: FormGroup;
constructor(fb: FormBuilder) {
// Constructor logic...
}
ngOnInit() {
this.myForm = this.fb.group({
"myText": [""]
});
}
}
该指令如下:
@Directive({
selector: "[my-directive]"
})
class MyDirective {
Input() formControl: FormControl;
}
但是如果我在模板中使用formControlName语法:
<form [formGroup]="myForm">
<input type="text" id="myText" formControlName="myText" my-directive>
</form>
我如何在指令中引用(隐式?)make FormControl?
答案 0 :(得分:46)
如果您使用NgControl
,ElementRef
,HostListener
和构造函数注入,我们可以使用适用于formControlName
或{{1}中的被动表单的表单控件的指令伪装甚至是模板驱动的形式:
[formControl]
答案 1 :(得分:4)
import { Directive, ElementRef} from "@angular/core";
import { NgControl } from "@angular/forms";
@Directive({
selector: '[my-directive]',
host: {
'(input)':'onEvent($event)',
'(keydown.backspace)': 'onEvent($event, true)'
})
export class MyDirective {
constructor(private el: ElementRef, private control : NgControl) { }
public onEvent($event, someEvent){
let valueToTransform = this.el.nativeElement.value;
// do something with the valueToTransform
if(someEvent) {
//do something
}
this.control.control.setValue(valueToTransform);
}
}
在Html中
<form [formGroup]="myForm">
<input type="text" id="myText" formControlName="myText" my-directive>
</form>