如何以角度保存和加载来自 html WYSIWYG 编辑器的内容

Posted

技术标签:

【中文标题】如何以角度保存和加载来自 html WYSIWYG 编辑器的内容【英文标题】:How to save and load content from html WYSIWYG editor in angular 【发布时间】:2019-03-09 07:42:11 【问题描述】:

如果这对这种情况有意义的话,我想我最终会在 MongoDB 中使用 node/express 后端...

我最终希望能够将内容从内容可编辑 div 保存到后端,以便以后可以从后端重新上传...然后可以将重新上传的数据放在不可编辑的用于显示的 html div,或返回到内容可编辑的 div 以进行更多编辑。

有人对此有什么建议吗?也许有一种方法可以保存编辑器 div 中的所有 dom 元素,以一种可以翻译回 HTML 以便呈现的方式?

谢谢,欢迎提出建议

HTML

  <div>
    <input type="button" (click)="iBold()" value="B">
  </div>
  <div id='editor' contenteditable>
    <h1>A WYSIWYG Editor.</h1>
    <p>Try making some changes here. Add your own text.</p>
  </div>

角度组件

import  Component, OnInit  from '@angular/core';

@Component(
  selector: 'app-dashboard',
  templateUrl: './dashboard.component.html',
  styleUrls: ['./dashboard.component.scss']
)
export class DashboardComponent implements OnInit 

  constructor()  

  model = '<h1>A WYSIWYG Editor.</h1><p>Try making some changes here.     Add your own text.</p>';

  editor: any;

  ngOnInit() 
    this.editor = document.getElementById('editor');
  
  iBold() 
    document.execCommand('bold', false, null);

  


【问题讨论】:

【参考方案1】:

Node/express 和 Mongo 听起来是个好主意。

返回 HTML / DOM 的东西,这听起来是个坏主意。将前端逻辑保留在前端。

在过去,前端逻辑和后端逻辑总是放在一起,例如php 和 Java。

如今,前端和后端之间存在分离是有充分理由的。

这种方法允许单个后端为可能的许多不同前端提供服务,如果后端返回 JSON,则前端可以根据需要呈现该 JSON。

如果您开始从后端返回 HTML,而另一个前端想要以不同的方式呈现该数据,那么您会被塞满。

如果您想通过公共 API 提供数据,那么您也会被塞满。

保持简单并从后端返回 JSON。

我们在我正在处理的项目中遇到了这个确切的问题,当它应该如此简单时真是令人头疼。

【讨论】:

好的,所以传递元素内部 html 的问题是因为如果使用公共 api 的安全问题?我的问题是将 html 翻译为 jsons,因为从 html 翻译为 json 似乎很奇怪……然后将 BACk 翻译为 html。相反,可以休息 api 将 innerhtml 作为字符串抓取并用管道对其进行消毒并渲染 有关解析 HTML 的安全问题,请参阅angular.io/guide/security#bypass-security-apis 好的,如果您采用您的方法,您可能会将后端绑定到单个前端 - 我理解您所提倡的方法的好处,但由于概述的原因,行业不遵循这种做法- 你可能会在管理编辑等方面面临许多不必要和复杂的挑战 - 更不用说可能很少有图书馆会尝试支持这种方法 - 你也可能会失去一些角度的力量......我意思是如果你尝试清理 它将如何处理它?你可能受限于静态 HTML 我非常怀疑是否有一个足够智能的库可以将 Angular HTML 转换为静态 HTML,更重要的是,它如何再次将其转换回来?如果您对静态 HTML 感到满意,那么它可能会起作用,但我不相信【参考方案2】:

我将添加第二个答案,因为我可能误解了第一个答案的问题。如果您谈论的是单个 div 的内容,那么您可以使用jQuery.parseHtml() 进行检查以确保内容有效

https://api.jquery.com/jquery.parsehtml/

为了获得额外的 umph,您可以使用 jsdom,它允许您从字符串创建 DOM:

https://www.npmjs.com/package/jsdom

您可以像遍历 Windows DOM 等一样遍历它。

还值得一看cheerio:

https://www.npmjs.com/package/cheerio

所有这些库都可以在客户端和服务器端使用。

它们可用于检查有效性、检查内容、检查不允许的标签等

在 Angular 中,您将呈现已知有效的 HTML,如下所示:

<div [innerHTML]="myHTML"></div>

见https://www.dev6.com/Angular-2-HTML-binding

您可能希望它像这样工作:

DIV ONE - 将 HTML 呈现为纯文本(仅在编辑期间)

DIV TWO - 如果解析的 HTML 在编辑期间和之后都有效,则呈现解析的 HTML(在编辑完成时应该始终有效,尝试关闭编辑会话应该使用上述库测试有效性)

但请考虑以下安全问题:

https://angular.io/guide/security#bypass-security-apis

【讨论】:

明天考试后我会花更多时间阅读这篇文章。非常感谢您的帮助...我对这个附带项目感到兴奋 如果我有任何问题,我也很可能会与您联系/再次感谢您!

以上是关于如何以角度保存和加载来自 html WYSIWYG 编辑器的内容的主要内容,如果未能解决你的问题,请参考以下文章

如何使用httpclient作为二进制文件以角度加载字体文件(ttf和otf)以使用opentype.js进行处理

以角度 5 在 HTML 上显示来自 json 对象的数据

以角度 8 加载页面时 Css 分散

以角度刷新下拉列表而不重新加载页面

保存和加载布尔状态

Android 在本地保存来自 Amazon API 的数据以减少加载时间?