将表单和输入设置为“ng-dirty”;编程上
Setting form and inputs to "ng-dirty" programatically
我以前从未使用过Angular或Angular2,但现在我必须对我的域名上运行的使用Angular2的网站进行更新。我需要以编程方式填写文本框并单击提交,但在使用.value = "val"设置文本框的值后,它仍然将文本框视为空。
我已经阅读了angular,现在了解了ng-dirty和ng-pristine的概念,但是通过编程将类更改为ng-dirty仍然不起作用。
似乎即使我改变了类,它仍然没有更新"原始"状态,它仍然认为文本框为空。
我读过关于"markAsDirty()",并尝试使用它,但我得到"markAsDirty不是一个函数"。我只需要弄清楚如何更新页面,以便它意识到文本框不是空的,并允许我提交表单。
非常感谢!
编辑:页面形式:
<form id="form_register" novalidate="">
<div class="form-steps">
<div class="form-group">
<div class="input-group">
<input autocomplete="off" class="form-control ng-pristine ng-invalid ng-touched" data-is-regex="true" data-mask="[a-zA-Z0-1'.]+" id="username" name="username" ngcontrol="username" placeholder="Username" required="" style="color: black !important;" tabindex="13" type="text">
</div>
</div>
<div class="form-group">
<div class="input-group">
<input autocomplete="off" class="form-control ng-untouched ng-pristine ng-invalid" id="password" name="password" ngcontrol="password" placeholder="Password" required="" style="color: black !important;" tabindex="14" type="password">
</div>
</div>
<div class="form-group">
<button class="btn btn-block btn-lg btn-info" tabindex="4" type="submit">
Log In
</button>
</div>
</div>
</form>
我的问题是:
document.getElementById("username").value = "testuser";
document.getElementById("password").value = "testpass";
document.getElementsByClassName("btn btn-block btn-lg btn-info")[0].click();
最终给我一个消息,说用户名和密码是必需的,即使有一个值显示在文本框中。只需单击文本框,输入一个字符,然后删除它,就可以提交表单,但是我需要在没有用户交互的情况下完成此操作。
你正在用原生javascript填充表单,这并没有更新angular模型。在你的后台组件中,你需要使用ngmodel来连接你的元素和组件。然后更新组件中的变量,一切都会正确反映。
好吧,我可以看到你的代码有一些问题,我将通过它来实现预期的工作。
对于模板驱动的表单,在模板中创建并分配表单组变量(这将使我们的闪亮NgForm
,我们稍后将ngControl
附加控件),并让我们绑定提交函数:
<form #myForm="ngForm" (ngSubmit)="submit(myForm.value)" id="form_register" novalidate="">
我们的每个输入都是独立的,还没有绑定到表单上,为了做到这一点,我们需要清除应该由Angular 2管理的ng-
类,并将[(ngModel)]绑定到一个属性中。
<input autocomplete="off" class="form-control" data-is-regex="true" data-mask="[a-zA-Z0-1'.]+"
id="username" name="username" placeholder="Username" ngControl="username" [(ngModel)]="username"
required style="color: black !important;" tabindex="13" type="text">
如果表单无效,我们将禁用提交:
<button [disabled]="myForm.invalid" class="btn btn-block btn-lg btn-info" tabindex="4" type="submit">Log In</button>
我们的类有我们绑定的username
和password
属性,以及我们的提交函数:
export class App {
password: string;
username: string;
submit(value) {
console.log("submitting: " + JSON.stringify(value));
}
}
最后,如果我们真的想用这种编程方式标记脏东西,我们必须在代码中使用ViewChild
:
@ViewChild('myForm') formGroup;
password: string;
ngAfterContentInit() {
this.formGroup.control.markAsDirty();
}
对于每个控件,我们需要通过formGroup
变量访问它,或者在输入上添加单独的模板变量,例如,我们可以使用[(ngModel)]="username" #username="ngModel"
获取。
这里有一个活塞,你可以玩一下,试着发展你的理解:http://plnkr.co/edit/ukJ1kq2UFBvtoCsxbyba?p=preview
- 如何仅在字段为$dirty时应用ng模式
- 重新编译角度指令以编程方式添加 ng-module 和 ng-change
- 以编程方式将 URL 加载到 ng 视图中
- ng-click似乎不适用于以编程方式插入的列表(li)元素
- 角度 1.2 |ng动画 |以编程方式阻止动画
- 以编程方式在 ng-repeat元素上切换类
- 通过编程将焦点放在ng网格中的第一行
- 以编程方式在ng-grid单元格中添加多行
- 将表单和输入设置为“ng-dirty”;编程上
- 如果我使用ng-show显示表单,$dirty总是false
- 如何以编程方式选择ng选项值
- 手动设置$dirty为ng-form false
- 如何使用Ranorex以编程方式检查ng模型绑定输入字段的值
- ng dirty没有按预期工作
- 如何在svg元素上以编程方式ng绑定属性
- 如何以编程方式从 ng 表中选择第一行
- 是否可以添加自定义元素作为'form元素'在angularJs中使用ng-dirty和ng-质朴
- $dirty在js代码中改变各自的ng-model值后不会改变
- 使用ng-model以编程方式更新文本
- 以编程方式将所有表单字段设置为在表单提交时进行 ng-touched