angular 结合 wangeditor 使用
ueditor 功能虽然丰富,但是配置起来确实麻烦,后台比较忙,没时间联调,导致图片上传的问题一直搁置,总不能一直放着呀,就想着找一个轻量级的,配置不需要那么麻烦的富文本编辑器。
功夫不负有心人,看了诸多的插件:ngx-quill 没有支持表格,ckeditor 配置起来跟 ueditor 差不多。。。
结果还真的让我找到了一个易用性的插件,而且功能也可以,满足现在的需求,因为功能比较急,就先不考虑以后的二次开发了,呲牙。
wangeditor,纯js+css写出来的富文本编辑器,整个js代码量才4000多行,算是轻量级的了~
下面开始使用流程梳理:
先看 demo:http://www.wangeditor.com/
该有的都有,那还等什么,直接安装吧: npm install wangeditor
然后我们创建一个组件,直接引入js文件,可能版本不同,对应包的目录结构不一样,不过最终是 wangEditor.js 就行:
有的 tsconfig.json 中没有配置 allowJs ,那么上面的 import 的js文件就会读不了,所以要设置一下:
然后我们界面中创建2个div,分别给上id,因为 wangeditor 是菜单栏编辑栏分离的,所以可以直接写成2个元素
接着组件加载完成,进行编辑器初始化:主要就是1个new,和 create() 方法,不配置的话会直接使用默认:
ng serve 启动项目可以看到功能可用:
到这一步就完成了,是不是配置比 ueditor 更加简单!
最终文件:
wang-editor.component.html ,这个编辑器没用那么多的api
<div class="wangeditor-box"> <div id="editorMenu"></div> <div id="editor" style="height:400px;max-height:500px;"> <p>{{defaultMessage}}</p> </div> <div class="btn-group"> <pre class="show-message">{{showMessage}}</pre> <div [innerHTML]="showMessage | html"></div> <hr/> <textarea rows="4" nz-input [(ngModel)]="textareaValue" class="text-area"></textarea> <button class="btn-search margin-l-10" nz-button [nzType]="'primary'" [nzSize]="'normal'" (click)="setContent()"> <span>设置内容</span> </button> <hr/> <button class="btn-search" nz-button [nzType]="'primary'" [nzSize]="'normal'" (click)="getContent()"> <span>获取内容(html)</span> </button> <button class="btn-search" nz-button [nzType]="'primary'" [nzSize]="'normal'" (click)="getContentText()"> <span>获取内容(纯文本)</span> </button> </div> </div>
wang-editor.component.scss ,可以自己调整样式,我这里调整了编辑器高度
@import "~wangeditor/release/wangEditor.min.css";
.wangeditor-box {
padding: 20px;
overflow: auto;
height: 100%;
#editor{
height: 400px;
width: auto;
border:1px solid #ccc;
}
.w-e-toolbar{
background-color: #f1f1f1;
border: 1px solid #ccc;
}
.btn-group {
button {
margin-right: 10px;
margin-bottom: 10px;
}
.show-message {
margin: 10px 0;
border: 1px solid #ccc;
height: 80px;
overflow: hidden;
text-overflow: ellipsis;
white-space: normal;
}
.text-area {
width: 50%;
}
.margin-l-10 {
margin-left: 10px;
}
}
}
wang-editor.component.ts
import { Component, ElementRef, OnInit, Renderer, ViewChild } from '@angular/core'; import { AppService } from '../../../app.service'; import * as wangEditor from '../../../../../node_modules/wangeditor/release/wangEditor.js'; /** * @description 富文本编辑测试组件 */ @Component({ selector: 'app-wang-editor', templateUrl: './wang-editor.component.html', styleUrls: [ './wang-editor.component.scss' ] }) export class WangEditorDemoComponent implements OnInit { public sign = 'wang_editor'; private editor: any; // 展示api获取到的数据 public showMessage = 'Waiting for display'; // 默认显示 public defaultMessage = '请输入内容...'; // 设置展示内容输入框变量 public textareaValue = '<p><span style="font-weight: bold;"> test:</span> 用<span style="color: ' + 'rgb(139, 170, 74);"> JS 设置的</span>内容 <img src="http://img.t.sinajs' + '.cn/t4/appstyle/expression/ext/normal/40/pcmoren_tian_org.png"></p>'; constructor (private appService: AppService, private el: ElementRef, private renderer: Renderer) { } ngOnInit () { this.editor = new wangEditor('#editorMenu', '#editor'); console.log(this.editor); // 设置编辑器配置 this.setEditorConfig(); // 创建编辑器 this.editor.create(); } // 编辑器相关配置设置 setEditorConfig () { // 使用 base64 保存图片 this.editor.customConfig.uploadImgShowBase64 = true; // 菜单展示项配置 // this.editor.customConfig.menus = this.getMenuConfig(); // 自定义配置颜色(字体颜色、背景色) this.editor.customConfig.colors = this.getColorConfig(); // 表情面板可以有多个 tab ,因此要配置成一个数组。数组每个元素代表一个 tab 的配置 this.editor.customConfig.emotions = this.getEmotionsConfig(); // 自定义字体 this.editor.customConfig.fontNames = this.getFontFamilyConfig(); // 编辑区域的z-index默认为10000 // this.editor.customConfig.zIndex = 100; // 配置编辑器内容改变触发方法 this.editor.customConfig.onchange = this.editorContentChange; // 编辑器获取到焦点触发方法 this.editor.customConfig.onfocus = this.editorOnFocus; // 编辑器失去焦点触发方法 this.editor.customConfig.onblur = this.editorOnBlur; } // 获取显示菜单项 getMenuConfig (): string[] { return [ 'bold', // 粗体 'italic', // 斜体 'underline', // 下划线 'head', // 标题 'fontName', // 字体 'fontSize', // 字号 'strikeThrough', // 删除线 'foreColor', // 文字颜色 'backColor', // 背景颜色 'link', // 插入链接 'list', // 列表 'justify', // 对齐方式 'quote', // 引用 'emoticon', // 表情 'table', // 表格 'image', // 插入图片 'video', // 插入视频 'code', // 插入代码 'undo', // 撤销 'redo' // 重复 ]; } // 获取字体、背景颜色列表配置 getColorConfig(): string[] { return [ '#000000', '#eeece0', '#1c487f', '#4d80bf', '#c24f4a', '#8baa4a', '#7b5ba1', '#46acc8', '#f9963b', '#ffffff' ]; } // 获取表情配置 getEmotionsConfig() { return [ { // tab 的标题 title: '默认', // type -> 'emoji' / 'image' type: 'image', // content -> 数组 content: [ { alt: '[坏笑]', src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/50/pcmoren_huaixiao_org.png' }, { alt: '[舔屏]', src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/40/pcmoren_tian_org.png' } ] }, { // tab 的标题 title: 'emoji', // type -> 'emoji' / 'image' type: 'emoji', // content -> 数组 content: ['😀', '😃', '😄', '😁', '😆'] } ]; } // 获取字体列表配置 getFontFamilyConfig(): string[] { return [ '宋体', '微软雅黑', 'Arial', 'Tahoma', 'Verdana' ]; } // 富文本编辑器内容变化触发方法 editorContentChange = (html) => { console.log(html); } // 编辑器获取到焦点触发事件 editorOnFocus = () => { console.log('on focus'); } // 编辑器失去焦点触发事件 editorOnBlur = (html) => { console.log('on blur'); console.log(html); } // 设置编辑器显示内容 setContent() { this.editor.txt.html(this.textareaValue); } // 获取编辑器内容,带html getContent() { this.showMessage = this.editor.txt.html(); } // 获取编辑器文字内容 getContentText() { this.showMessage = this.editor.txt.text(); } }
解析的话还是 innerHtml ,管道用的是上一篇写好的管道~
引个地址:https://www.kancloud.cn/wangfupeng/wangeditor3/332599 , 使用手册,很详细,很简单
以及git:https://github.com/wangfupeng1988/wangEditor
注:
本地设置了 :this.editor.customConfig.uploadImgShowBase64 = true;
所以没有用到后端的上传地址,转成了 base64,直接将带html标签的字符串传给后台,后台保存成文件。