Angular17版本集成Quill富文本编辑器
前言:网上找了好多富文本资源,对应Angular17版本的且兼容的太少了,且找到不到对应的版本
自己就去网上找个兼容的免费的富文本组件
1.兼容Angular17版本的quill包
"@types/quill": "^1.3.10","ngx-quill": "^24.0.0","quill": "^1.3.7","quill-delta": "^5.1.0","quill-image-resize-module": "^3.0.0","rxjs": "^7.5.7",
其中 “rxjs”:需要和 “ngx-quill”: “^24.0.0”,兼容 所以是 ^7.5.7版本
quill-image-resize-module": “^3.0.0”,是图片操作 对图片放大放小
2.引入配置文件
angular.json中需要引入css/js 不在这里引入的话组件会报错
"scripts": ["node_modules/quill/dist/quill.min.js","node_modules/quill-image-resize-module/image-resize.min.js"]
"styles": ["node_modules/driver.js/dist/driver.css","node_modules/quill/dist/quill.snow.css"]
要找到位置添加
封装组件
我是在原有的组件上封装的组件,因为涉及到图片上传,和绑定表单数据所以自己就封装个独立组件方便使用
其中html
<div id="editor"></div>
样式:less
#editor {min-height: 400px;max-height: 800px;overflow: auto;
}
ts
import { Component, forwardRef, Input, OnInit } from '@angular/core';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
import { HttpClient } from '@angular/common/http';
import Quill from 'quill';
import ImageResize from 'quill-image-resize-module';
// 注册ImageResize模块
Quill.register('modules/imageResize', ImageResize);
@Component({selector: 'app-qu-editor',standalone: true,templateUrl: './qu-editor.component.html',styleUrls: ['./qu-editor.component.less'],providers: [{provide: NG_VALUE_ACCESSOR,useExisting: forwardRef(() => QuEditorComponent),multi: true}]
})
export class QuEditorComponent implements OnInit, ControlValueAccessor{@Input() uploadDir: string = "pmc/image/project"; // 默认的上传目录quillEditor: any;editorContent: string = '';constructor(private http: HttpClient) {}ngOnInit() {this.initEditor();}initEditor() {this.quillEditor = new Quill('#editor', {theme: 'snow',modules: {toolbar: [[{ 'header': [1, 2, 3, 4, 5, 6, false] }],['bold', 'italic', 'underline', 'strike'],[{ 'list': 'ordered'}, { 'list': 'bullet' }],[{ 'indent': '-1'}, { 'indent': '+1' }],[{ 'size': ['small', false, 'large', 'huge'] }],[{ 'color': [] }, { 'background': [] }],[{ 'align': [] }],['link', 'image', 'video', 'code-block'],['clean']],imageResize: {} // 添加imageResize模块},});this.quillEditor.on('text-change', () => {this.onChange(this.quillEditor.root.innerHTML);});this.quillEditor.getModule('toolbar').addHandler('image', this.imageHandler.bind(this));}imageHandler() {const input = document.createElement('input');input.setAttribute('type', 'file');input.setAttribute('accept', 'image/*');input.click();input.onchange = () => {const file = input.files[0];if (file) {const formData = new FormData();formData.append('file', file);formData.append('dir', this.uploadDir);this.http.post<any>('/pmc/upload', formData).subscribe(res => {if (res.success) {const range = this.quillEditor.getSelection();this.quillEditor.insertEmbed(range.index, 'image', res.data);} else {console.error('Image upload failed: ' + res.msg);}},err => {console.error('Image upload failed: ' + err.message);});}};}writeValue(value: any): void {this.editorContent = value;if (this.quillEditor) {this.quillEditor.root.innerHTML = this.editorContent;}}onChange = (value: any) => {};onTouched = () => {};registerOnChange(fn: any): void {this.onChange = fn;}registerOnTouched(fn: any): void {this.onTouched = fn;}
}
使用:
在表单里面使用:
<nz-form-item><nz-form-label [nzSpan]="4" nzFor="description">产品描述</nz-form-label><nz-form-control [nzSpan]="16" nzHasFeedback nzErrorTip="产品描述"><app-qu-editor formControlName="description"></app-qu-editor></nz-form-control></nz-form-item>
可以通过传值修改图片上传路径
也可以通过[ngModel]绑定值