如何使用 ngModel 在 div 的 innerhtml 属性上实现 2 路数据绑定?

Posted

技术标签:

【中文标题】如何使用 ngModel 在 div 的 innerhtml 属性上实现 2 路数据绑定?【英文标题】:How to achieve 2 way data binding on a div's innerhtml property using ngModel? 【发布时间】:2019-10-12 16:56:47 【问题描述】:

在我的角度组件 ts 文件中,我有一个模型,其值为 html 格式的文本。 文本使用组件的 .html 文件中 div 的内部 html 属性显示在 UI 中。 通过设置可编辑属性使 div 可编辑。

代码sn-p:

<div id="requestBody" contenteditable="true" 
*ngIf="selectedReqTab==='reqBody'" [innerHTML]="formatJson(requestBody)"></div>

这里 formatJson 返回的是 html 格式的 JSON 文本。

问题:

即使我们使用 ngModel 进行 2 路数据绑定,文本中所做的更改也不会反映在相应的模型中。

<div id="requestBody" contenteditable="true" 
*ngIf="selectedReqTab==='reqBody'" [(ngModel)]=”requestBody” 
[innerHTML]="formatJson(requestBody)"></div>

我在这里做错了什么?你能建议一下吗?

【问题讨论】:

据我所知,contenteditable 元素不会触发 change 事件,这是 ngModel 双向绑定所依赖的。尝试绑定到inputkeyup 事件。如果你这样做,我建议从它们创建一个 Observable,这样你就可以使用像 debounceTimedistinctUntilChanged 这样的运算符来避免发生太多事件。 【参考方案1】:

contenteditable 不是输入,两种方式的绑定适用于输入。

你必须通过input事件更新你的模型,as shown here

<p (input)="updateModel(model.innerText)" #model contenteditable> name </p>

【讨论】:

以上是关于如何使用 ngModel 在 div 的 innerhtml 属性上实现 2 路数据绑定?的主要内容,如果未能解决你的问题,请参考以下文章

js页面实时显示时间

Angular 2 如何在选择列表表单中使用 [(ngModel)]

如果我使用 ngModel、ngValue 以及如何在选择中添加占位符,如何设置选择的默认值

垫子滑块ngModel不工作角度5

如何在离子无线电元件上使用 ngModel?

在 textarea 上使用 [(ngModel)] 绑定时如何避免 ExpressionChangedAfterItHasBeenCheckedError