原项目集成TinyMCE
,但公式录入须要购买昂贵的MathType
或自研插件,遂启用UEditor
,集成开源的公式插件。javascript
UEditor
对三大框架的支持不是很好,也尝试了ngx-ueditor
,用完以后的结论,我不用这个东西。html
总结出一句话:TS
写ANY
,整死程序员。前端
若是想经过ngx-ueditor
集成,请参考angular 使用 ueditor - 鲸冬香。java
进入官网,在下载页下载示例代码。程序员
UEditor
是基于MIT
协议开源的,被受权人能够使用、复制、修改、合并、出版发行、散布、再受权及贩售软件及软件的副本,且能够自由地修改源代码。web
将前端代码拷贝至src/assets/ueditor
目录下。typescript
编辑angular.json
文件,定位到projects->web->architect->build->options->scripts
数组下:json
添加以下配置,将ueditor
加入到项目构建中。segmentfault
"src/assets/ueditor/ueditor.config.js", "src/assets/ueditor/ueditor.all.min.js", "src/assets/ueditor/lang/zh-cn/zh-cn.js"
注:ueditor.config.js
必定要在ueditor.all.min.js
以前引入,不然window.UE
对象会被覆盖。api
原项目将TinyMCE
封装成Editor
组件,如今须要将Editor
组件的内部实现替换为UEditor
。
官方文档上来一个script
给我整懵圈了,容器怎么能用script
呢?
经测试,官方文档的写法是错误的,不能使用script
当容器。
每一个编辑器都应该配置惟一id
,用于查找DOM
,构建编辑器实例。
在ngOnInit
方法中,请求生成惟一id
。
/** 请求惟一 id */ this.editorId = 'editor-' + this.commonService.getUniqueId();
<div [id]="editorId"></div>
在ngAfterViewInit
方法中构造编辑器,须要页面渲染以后,UEditor
才能根据id
构造编辑器,并设置事件监听。
/** 实例化 UEditor */ this.editor = UE.getEditor(this.editorId); /** ready 时触发方法 */ this.editor.ready(() => { /** 设置内容 */ this.editor.setContent(this.content); /** 添加输出监听器 */ this.editor.addListener('contentChange', () => { this.contentEmit(); }); });
按照官方的描述,后台配置一个接口,根据不一样的action
返回不一样的数据。
后台配置handler
,根据不一样的action
转发给不一样的方法。
@RequestMapping public Object handler(@RequestParam(value = "action", required = false) String action, @RequestParam(value = "attachment", required = false) MultipartFile multipartFile) { if (KEY_CONFIG.equals(action)) { return this.getConfig(); } if (KEY_UPLOAD.equals(action)) { return this.uploadImage(multipartFile); } throw new RuntimeException("未传入正确的 action"); } /** * 获取配置信息 */ private Config getConfig() { logger.debug("返回配置信息"); Config config = new Config(); config.setImageActionName(KEY_UPLOAD); config.setImageFieldName("attachment"); config.setImageUrlPrefix(""); config.setImageAllowFiles(Arrays.asList(".png", ".jpg", ".jpeg", ".gif", ".bmp")); return config; } private UEditorImage uploadImage(MultipartFile multipartFile) { if (multipartFile == null || multipartFile.isEmpty()) { return null; } logger.debug("上传附件"); Attachment attachment = this.attachmentService.upload(multipartFile); logger.debug("图片存储"); UEditorImage image = new UEditorImage(); image.setState("SUCCESS"); image.setTitle(attachment.getName()); image.setOriginal(attachment.getOriginName()); image.setUrl(String.format("/%s/%s/%s/%s/%s/%s", properties.getPrefix(), properties.getAttachment(), attachment.getMd5(), attachment.getSha1(), attachment.getId(), attachment.getOriginName())); return image; }
在ueditor.config.js
文件中配置图片服务器接口地址。
// 服务器统一请求接口路径 serverUrl: "/api/ueditor"
将整个插件放入ueditor
目录下。
将插件集成到angular.json
文件中。
"src/assets/ueditor/kityformula-plugin/addKityFormulaDialog.js", "src/assets/ueditor/kityformula-plugin/getKfContent.js", "src/assets/ueditor/kityformula-plugin/defaultFilterFix.js"
UEditor
集成较复杂,可能再也不适合当前环境,期待下一代富文本编辑器的发展。