我正在关注一个关于反应形式的Angular 4教程。在使用FormGroup和FormControl指令时,我发现了一个不一致的地方 -
<form [formGroup]="formObj">
<div class="form-group">
<input formControlName="username">
它在方括号下应用[formGroup]指令而不使用方括号的formControlName指令。
我在这里缺少什么?
答案 0 :(得分:7)
如果您的指令mydir
包含输入mydir
:
@Directive(...)
export class MyDir {
@Input() mydir;
可以使用或不使用括号:
<span mydir="exp">...</span>
<span [mydir]="exp">...</span>
在第一种情况下,mydir
绑定的值将是字符串exp
:
export class MyDir {
@Input() mydir;
ngOnInit() {
console.log(this.mydir); // "exp"
在第二种情况下,表达式将被评估为父组件包含的任何exp
:
@Component(template: `<span mydir="exp"`)
class Parent {
exp = 'hello';
export class MyDir {
@Input() mydir;
ngOnInit() {
console.log(this.mydir); // "hello"
现在,使用表单指令。
formGroup
需要FormGroup
类的实例。如果不使用[]
,则指令将获取字符串formObj
而不是对象。
formControlName
需要一个字符串,该字符串是在父表单组中查找的控件名称。这就是没有括号的原因。
答案 1 :(得分:2)
很好的问题,对Angular来说很重要:指令(例如formGroup或formControlName)可以在正常写入时设置为等于字符串,或者用方括号括起来设置为等于组件TypeScript中的值。
因此ionViewDidEnter() {
let input = <HTMLInputElement>document.querySelector('.scoreboardus input');
input.addEventListener('change', (event) => {
console.log("onChange function fired");
//Your onChange function here. Do what you want
this.text = event.target["value"];
})
//Now we try to change your input value by javascript
setTimeout(() => {
input.value = "Hey. Im changing";
//Trigger onChange function manually
var evt = document.createEvent("HTMLEvents");
evt.initEvent("change", false, true);
input.dispatchEvent(evt);
console.log("I'm done");
}, 3000)
}
将formGroup指令设置为等于实际的动态对象,而[formGroup]="formObj"
设置为等于字符串“name”