Angular17版本集成Quill富文本编辑器

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]绑定值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/849231.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

备战618!各广告平台SDK版本更新;最新支持eCPR指标;新增自动创建广告源平台 | TopOn产品更新

「TopPro 每月产品速递」是由TopOn最新推出的产品专栏&#xff0c;将会以月为周期梳理TopOn最新产品动态&#xff0c;致力于为互联网从业者提供优质服务&#xff0c;引领行业产品发展。 TopPro | 3~5月产品速递 2024.03.01-05.30 01 eCPR指标支持 // 功能描述 TopOn后台支…

C语言字符、数组指针变量

目录 一、字符指针变量 二、数组指针变量 a.数组指针变量是什么 b.数组指针变量的书写格式 c.数组指针变量如何初始化 d.二维数组传参的本质 一、字符指针变量 在指针的类型中我们知道有一种指针类型为字符指针 char* 。 其一般使用&#xff1a; int main() {char ch w…

ES 8的向量检索性能调优实践

前言 ES的官方实验室曾发布过一篇博客,介绍了使ES向量检索性能获得显著提升的技术要点与展望: 多线程搜索能力的利用:Lucene 的分段架构允许实现多线程搜索能力。Elasticsearch 通过同时搜索多个段来提高性能,使用所有可用的 CPU 核心的计算能力显著减少了单个搜索的延迟。…

关闭windows11磁盘地址栏上的历史记录

关闭windows11的磁盘地址栏上的历史记录 windows11打开磁盘后访问某一个磁盘路径后会记录这个磁盘路径&#xff0c;而且有时候会卡住这个地址栏&#xff08;关都关不掉&#xff09;&#xff0c;非常麻烦。 如下图所示&#xff1a; 关闭地址栏历史记录 按下windows键打开开…

Python 机器学习 基础 之 【常用机器学习库】 Matplotlib 数据可视化库

Python 机器学习 基础 之 【常用机器学习库】 Matplotlib 数据可视化库 目录 Python 机器学习 基础 之 【常用机器学习库】 Matplotlib 数据可视化库 一、简单介绍 二、Matplotlib 基础 1、安装 Matplotlib 2、导入 Matplotlib 3、基本绘图 3.1 绘制简单折线图 3.2、绘…

【AutoSar网络管理】如何循环测试CAN网络管理的唤醒时间

测试用例: Preconditions: DUT出于休眠状态 Steps to reproduce: Step1:仿真外部NM报文,唤醒ECU。 Step2:停止仿真Step1的报文,从总线上最后一帧NM开始,等待时间T。 Step3:仿真外部NM报文,此时记录为T1。 Step4:等待DUT发送第一帧报文,此时记录为T2,计算T2 - T1。…

8086 汇编笔记(十二):int 指令 端口 直接定址表

一、int 指令 int 指令的格式为:int n&#xff0c;n 为中断类型码&#xff0c;它的功能是引发中断过程 CPU 执行 intn 指令&#xff0c;相当于引发一个n号中断的中断过程&#xff0c;执行过程如下&#xff1a; (1) 取中断类型码 n; (2) 标志寄存器入栈&#xff0c;IF0&…

Vue3页面进入动画

这里我使用了一种页面动画库animate.css 这里我附上它的链接 Animate.css | A cross-browser library of CSS animations. 我使用的是Vue3 //App.vue代码如下 <router-view v-slot"{ Component, route }"><transitionbefore-enter"beforeEnter"en…

Framework | Android Rescue Party: 提升设备恢复力的机制

Framework | Android Rescue Party: 提升设备恢复力的机制 什么是 Rescue Party? Rescue Party 是 Android 操作系统中的一种机制,旨在当设备遇到系统崩溃或启动失败时提供自动恢复的方案。这一机制特别针对系统关键组件的反复崩溃,防止设备陷入无法使用的状态。 主要功能…

【内窥镜】内窥镜行业中需要FPGA解决的问题

医用内窥镜的开发难点 技术集成&#xff1a;内窥镜集成了光学、人体工程学、精密机械、现代电子、计算机软件等多项技术&#xff0c;这些技术的集成对研发团队的技术广度和深度提出了高要求。 图像质量&#xff1a;内窥镜的图像质量直接影响诊断的准确性。提高图像分辨率、色彩…

学习笔记——网络参考模型——TCP/IP模型(网络层)

三、TCP/IP模型-网络层 1、IPV4报头 (1)IPV4报文格式 IP Packet(IP数据包)&#xff0c;其包头主要内容如下∶ Version版本∶4 bit&#xff0c;4∶表示为IPv4; 6∶表示为IPv6。 Header Length首部长度∶4 bit&#xff0c;代表IP报头的长度(首部长度)&#xff0c;如果不带Opt…

给自己Linux搞个『回收站』,防止文件误删除

linux没有像windows里一样的回收站&#xff0c;工作时候删除文件容易不小心删错&#xff0c;造成麻烦的后果。所以给自己整了个回收站&#xff1a; 文件删除&#xff0c;新建~/opts/move_to_trash.sh&#xff0c;然后在里面新增&#xff0c;将${your_name}改成你的用户名。同时…

Java 还能不能继续搞了?

金三银四招聘季已落幕&#xff0c;虽说行情不是很乐观&#xff0c;但真正的强者从不抱怨。 在此期间&#xff0c;我收到众多小伙伴的宝贵反馈&#xff0c;整理出132道面试题&#xff0c;从基础到高级&#xff0c;有八股文&#xff0c;也有对某个知识点的深度解析。包括以下几部…

【第二篇】SpringSecurity源码详解

一、SpringSecurity中的核心组件 在SpringSecurity中的jar分为4个,作用分别为 jar作用spring-security-coreSpringSecurity的核心jar包,认证和授权的核心代码都在这里面spring-security-config如果使用Spring Security XML名称空间进行配置或Spring Security的Java configura…

HackTheBox-Machines--Aragog

Aragog 测试过程 1 信息收集 NMAP 服务器开启了 21、22、80端口 21 端口测试 首先测试 21 端口&#xff0c;21端口开启了匿名登录 ftp服务器上存在 test.txt 文件&#xff0c;test.txt 文件是 xml 格式。 80 端口测试 echo "10.129.97.250 aragog.htb" | sudo tee…

鸿蒙全栈开发-基于ARKTS开发之初识框架-app.json5

前言 随着鸿蒙的不断发展,华为自行研制的“鸿蒙系统”横空出世&#xff0c;华为用实力为自己开辟了一个全新的时代&#xff0c;让中国品牌走向世界,并为程序员们带来了新的职业机遇。 这里来跟大家简单的聊一下鸿蒙基于ARKTS开发之初识框架-app.json5 当我们新建一个工程或者…

python的视频处理FFmpeg库使用

FFmpeg 是一个强大的多媒体处理工具,用于录制、转换和流式传输音频和视频。它支持几乎所有的音频和视频格式,并且可以在各种平台上运行。FFmpeg 在 Python 中的使用可以通过调用其命令行工具或使用专门的库如 ffmpeg-python。以下是详细介绍如何在 Python 中使用 FFmpeg,包括…

沃可趣产品增PC版,员工社区登上大屏幕

作为企业内部沟通与协作的枢纽&#xff0c;员工互动社区在促进信息流通、增强团队凝聚力方面扮演着关键角色。 沃可趣&#xff0c;这一匠心打造的员工互动社区&#xff0c;融汇了工作、学习与社交的精髓&#xff0c;为职场人构筑了一站式互动天地。 为了满足更广泛的工作场景…

交流回馈老化测试负载:行业竞争态势

在当今的科技行业中&#xff0c;交流回馈老化测试负载设备已经成为了一个重要的组成部分。这种设备主要用于模拟电力系统中的各种负载情况&#xff0c;以便对电力系统进行全面的测试和评估。随着科技的不断发展&#xff0c;这个行业的竞争态势也在不断变化。 从市场竞争的角度来…

Flutter 中的 ListWheelViewport 小部件:全面指南

Flutter 中的 ListWheelViewport 小部件&#xff1a;全面指南 Flutter 是一个功能强大的 UI 框架&#xff0c;由 Google 开发&#xff0c;允许开发者使用 Dart 语言构建高性能、美观的移动、Web 和桌面应用。在 Flutter 的丰富组件库中&#xff0c;ListWheelViewport 是一个用…