【发布时间】:2018-07-25 05:06:28
【问题描述】:
我觉得我必须在这里遗漏一些东西,并想知道是否有更好的方法来做到这一点。
我有一个指令,它基本上将一个类添加到输入字段的父元素。在加载时我需要检查输入字段是否有值,你会认为这很简单......
我现在使用了几个不同的选项,包括 ngOnInit、AfterContentInit 和 AfterViewInit。但是对于下面我仍然在AfterContentInit:
ngAfterContentInit() {
console.log(this.el.nativeElement); // Element Object "Value is not empty if you look inside the object."
console.log(this.el.nativeElement.value); // = ''
setTimeout(() => {
console.log(this.el.nativeElement.value); // = 'The Value!'
}, 1000);
this.activeStateCheck(this.el.nativeElement);
}
activeStateCheck(element) {
if (element.value !== '') {
element.parentElement.classList.add('active');
return true;
}
}
我应该指出,所有选项都给出相同的结果。
第一个控制台注销一个空字符串,第二个控制台注销实际字符串。在这种情况下,它是“Grand Tour”。
我的问题是如何在不使用setTimeout 的情况下执行此操作?
似乎必须等待数据加载到页面上才能记录值。但是我的印象是OnInit 是为了等待这个完成?
我之所以想找到更好的解决方案是因为如果页面加载时间超过一秒,那么控制台日志将输出一个空字符串,因此不是一个完整的解决方案。
这是一个被调用指令的例子。注意appPlaceholder 属性:
<fieldset class="form__placeholder">
<input type="text"
id="lastName"
formControlName="lastName"
appPlaceholder>
<label for="lastName"
class="form__placeholder--label">
Lastname:
</label>
</fieldset>
【问题讨论】:
-
我不确定您为什么要尝试访问本机元素的值。使用响应式表单或模板表单并在组件 ts 文件中设置输入值。显示您的其他组件的代码和 html 会很有帮助
-
我已将 html 添加到问题中。即将添加 activeStateCheck。
-
由于您使用的是 formControlName,我假设您使用的是响应式表单。您可以通过执行此操作订阅输入的值更改。[enterFormName].get('lastName') .valueChanges.subscribe(value => {这里你调用你的活动状态检查函数});
-
对不起,凯文,我不明白。您是否打算将此代码放入指令中?另外,我该如何将 formName 传递给指令?
标签: angular angular2-directives