fooObj.expDate
会实时更新并进行验证。我使用了pre标签以便更加清晰明了。 <pre>{{fooObj.someDate | json}}</pre>
<div class="form-group inline-form__input">
<label for="someDate">Some Date</label>
<input tabindex="2"
type="tel"
class="form-control"
maxlength="7"
placeholder="MM/YY"
formControlName="someDate"
name="someDate"
[(ngModel)]="fooObj.someDate"
someDate>
</div>
然而,我在这个字段上使用了
someDate
指令。该指令拦截粘贴事件,取消粘贴事件,对输入进行一些花式格式化,然后执行以下操作:setTimeout(() => {
this.target.value = 'lol fancy date';
}, 3000);
target.value
是我的 someDate
字段。在输入框内,该值可以更新(我可以看到屏幕上的变化)。然而,fooObj.someDate
没有被更新,也没有发生验证。例如,在超时中设置目标值不会触发与键入/粘贴/任何其他 JavaScript 事件相同的验证/对象更新。
Angular 文档 对此没有太多有用的说法:
Angular 仅在应用程序对异步事件(例如按键)做出响应时更新绑定(因此更新屏幕)。此示例代码将 keyup 事件绑定到数字 0,这是可能的最短模板语句。虽然该语句没有任何有用的功能,但它满足 Angular 的要求,以便 Angular 将更新屏幕。
那么,我如何从指令触发字段的更新?
编辑:我尝试按照评论中的建议在元素上触发事件,使用此处找到的代码在我的元素上:如何手动触发 onchange 事件?
运行正常,但不强制更新字段:
if ("createEvent" in document) {
var evt = document.createEvent("HTMLEvents");
evt.initEvent("change", false, true);
this.target.dispatchEvent(evt);
}
else
this.target.fireEvent("onchange");
另外,这就是我认为合成事件不会触发“正常”操作(如按下键或其他操作)的原因(我真的希望我理解有误或他们在这种情况下是错误的,但尝试重新发出粘贴事件时它并没有起作用):https://www.w3.org/TR/clipboard-apis/#clipboard-event-interfaces
注意: 合成事件没有默认操作。换句话说,虽然上面的脚本将触发粘贴事件,但数据实际上不会被粘贴到文档中。