javascript - Angular - 修改innerHTML
问题描述
我需要更改一个元素的 innerHTML,我决定创建一个属性指令来完成这项任务。我创建了以下示例来说明我基本上想要做的事情:
我使用插值来设置段落的内容:
<p changeContentDirective>{{content}}</p>
如果用户将鼠标悬停在段落上,“changeContentDirective”会修改段落的 innerHTML。
this.el.nativeElement.innerHTML = 'modified by directive';
我还设置了一个函数在 5 秒后执行,这将改变“内容”属性的值:
ngOnInit() {
setTimeout(() => {
console.log('timeout: modify content');
this.content = 'modifed after timeout'
}, 5000);
}
如果我不将鼠标悬停在段落上,则内容将在 5 秒后更改。奇怪的是,如果我将鼠标悬停在元素上(显然在处理程序被执行之前),setTimeout 中的处理程序不会修改内容
我不确定为什么会发生这种情况,似乎在我以编程方式修改 innerHTML 之后,从 AppComponent 更改“内容”属性对段落显示的 html 没有任何影响。
在我正在做的实际应用中,结构比较复杂,我不必修改一个段落的innerHTML,而是不同td的属于一个表(剑道网格)的innerHTML,因为这个我不'认为我不能使用管道。
我的问题是我是否可以通过访问本机元素来修改指令中元素的 innerHTML 以及为什么会出现这个奇怪的问题?
提前致谢
解决方案
出现此问题是因为innerHTML
此元素的 包含角度插值。
当您覆盖 thisinnerHTML
时,内插值content
会丢失。
您可以通过更改来更改段落中显示的内容
this.el.nativeElement.innerHTML = 'modified by directive';
至
this.el.nativeElement.innerText = 'modified by directive';
请参阅此stackblitz以供参考。
编辑:感谢@DanielBeck发现此结果仅适用于 Chrome 浏览器。
但是这种技术是不好的做法,因为有更好的方法来更改innerHTML
元素的 (例如,此处描述)。
推荐阅读
- ios - 如何以编程方式生成一个空的 UIimage 视图
- javascript - 基于点击事件的传单多个弹出窗口
- stripe-payments - Stripe paymentIntent vs Subscription?
- python - Odoo 版本 13:使用自动化操作添加订阅行
- android - 从其他片段更新 recyclerview 适配器
- python - 具有类属性的列表理解
- html - 是否有 Python 函数可以抓取不同的类名?
- c++ - c++ 向量的 size() 和 capacity()
- python - 从近似的相对距离估计绝对位置
- c++ - c++ 错误:'operator!=' 不匹配(操作数类型为 'std::basic_istream
' 和 'long int')