ueditor 功能虽然丰富,但是配置起来确实麻烦,后台比较忙,没时间联调,导致图片上传的问题一直搁置,总不能一直放着呀,就想着找一个轻量级的,配置不需要那么麻烦的富文本编辑器。
功夫不负有心人,看了诸多的插件:ngx-quill 没有支持表格,ckeditor 配置起来跟 ueditor 差不多。。。
结果还真的让我找到了一个易用性的插件,而且功能也可以,满足现在的需求,因为功能比较急,就先不考虑以后的二次开发了,呲牙。
wangeditor,纯js+css写出来的富文本编辑器,整个js代码量才4000多行,算是轻量级的了~
下面开始使用流程梳理:
先看 demo: http://HdhCmsTestwangeditor测试数据/
该有的都有,那还等什么,直接安装吧:?npm install wangeditor
然后我们创建一个组件,直接引入js文件,可能版本不同,对应包的目录结构不一样,不过最终是 wangEditor.js 就行:
有的 tsconfig.json 中没有配置 allowJs ,那么上面的 import 的js文件就会读不了,所以要设置一下:
然后我们界面中创建2个div,分别给上id,因为 wangeditor 是菜单栏编辑栏分离的,所以可以直接写成2个元素
接着组件加载完成,进行编辑器初始化:主要就是1个new,和 create() 方法,不配置的话会直接使用默认:
ng serve 启动项目可以看到功能可用:
到这一步就完成了,是不是配置比 ueditor 更加简单!
最终文件:
wang-editor测试数据ponent.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测试数据ponent.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测试数据ponent.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测试数据ponent.html' ,
styleUrls: [ './wang-editor测试数据ponent.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://HdhCmsTestkancloud.cn/wangfupeng/wangeditor3/332599 ? , 使用手册,很详细,很简单
官网: http://HdhCmsTestwangeditor测试数据/
? 以及git: https://github测试数据/wangfupeng1988/wangEditor
注:
本地设置了 :this.editor.customConfig.uploadImgShowBase64 = true;
所以没有用到后端的上传地址,转成了 base64,直接将带html标签的字符串传给后台,后台保存成文件。
查看更多关于angular 结合 wangeditor 使用的详细内容...