在 Angular 中向 ckeditor 添加简单的上传适配器

2024-02-27

我确实通过安装在我的角度项目中启动了经典的ckeditor...

npm install --save @ckeditor/ckeditor5-angular
npm install --save @ckeditor/ckeditor5-build-classic

在我的组件中我已经导入了它......

import * as ClassicEditor from '@ckeditor/ckeditor5-build-classic';

发起对象...

  public Editor = ClassicEditor;

在模板中这样开始

        <ckeditor [config]="{ toolbar: [ 'heading', '|', 'bold', 'italic' ] }" name="Blog" placeholder="About your ride" [(ngModel)]="formModel.Blog" required [editor]="Editor" data="<p>Blog!</p>"></ckeditor>

现在我想向此编辑器添加简单上传适配器。

我确实安装了

npm install --save @ckeditor/ckeditor5-upload

然后有写着

  • 将 SimpleUploadAdapter 添加到我的插件列表中https://ckeditor.com/docs/ckeditor5/latest/features/image-upload/simple-upload-adapter.html https://ckeditor.com/docs/ckeditor5/latest/features/image-upload/simple-upload-adapter.html

我被困在这里了。我不知道该插件列表是什么以及在哪里。

有什么想法如何将图像上传添加到我的 ckeditor 吗?

Update在我的组件中这样做了:

  public Editor = ClassicEditor;
  public config = { plugins: [SimpleUploadAdapter]};

在我的 HTML 中调用相同的

<ckeditor [config]="{ toolbar: [ 'heading', '|', 'bold', 'italic' ] }" name="Blog" placeholder="About your ride" [(ngModel)]="formModel.Blog" required [editor]="Editor" data="<p>Blog!</p>"></ckeditor>

出现错误

未捕获的 CKEditorError:ckeditor 重复模块:某些 CKEditor 5 模块重复


我通过使用自定义上传适配器而不是简单上传适配器 - i.e.

  1. 复制仅限班级从这里:https://ckeditor.com/docs/ckeditor5/latest/framework/guides/deep-dive/upload-adapter.html#the-complete-implementation https://ckeditor.com/docs/ckeditor5/latest/framework/guides/deep-dive/upload-adapter.html#the-complete-implementation
    (我稍微调整了一下以避免 TypeScript 错误,并更改了 URL)
  2. 将类导入到 Angular 组件中
  3. Add a ready提供实现的处理程序createUploadAdapter

所以我的代码是:

我的上传适配器.ts:

export class MyUploadAdapter {
    loader: any;
    xhr: any;
    constructor( loader ) {
        this.loader = loader;
    }
    upload() {
        return this.loader.file
            .then( file => new Promise( ( resolve, reject ) => {
                this._initRequest();
                this._initListeners( resolve, reject, file );
                this._sendRequest( file );
            } ) );
    }
    abort() {
        if ( this.xhr ) {
            this.xhr.abort();
        }
    }
    _initRequest() {
        const xhr = this.xhr = new XMLHttpRequest();
        xhr.open( 'POST', 'http://yourserver/upload', true ); // TODO change the URL
        xhr.responseType = 'json';
    xhr.setRequestHeader("Accept", "application/json");
    }
    _initListeners( resolve, reject, file ) {
        const xhr = this.xhr;
        const loader = this.loader;
        const genericErrorText = `Couldn't upload file: ${ file.name }.`;
        xhr.addEventListener( 'error', () => reject( genericErrorText ) );
        xhr.addEventListener( 'abort', () => reject() );
        xhr.addEventListener( 'load', () => {
            const response = xhr.response;
            if ( !response || response.error ) {
                return reject( response && response.error ? response.error.message : genericErrorText );
            }
            resolve( {
                default: response.url
            } );
        } );
        if ( xhr.upload ) {
            xhr.upload.addEventListener( 'progress', evt => {
                if ( evt.lengthComputable ) {
                    loader.uploadTotal = evt.total;
                    loader.uploaded = evt.loaded;
                }
            } );
        }
    }
    _sendRequest( file ) {
        const data = new FormData();
        data.append( 'upload', file );
        this.xhr.send( data );
    }
}

我的组件.html:

<ckeditor ... (ready)="onReady($event)"></ckeditor>

我的组件.ts:

import * as ClassicEditor from '@ckeditor/ckeditor5-build-classic';
import { MyUploadAdapter } from '../my-upload-adapter';

//...

export class MyComponent implements OnInit {
    Editor = ClassicEditor;

//...

    onReady(editor: ClassicEditor): void {
        editor.plugins.get( 'FileRepository' ).createUploadAdapter = ( loader ) => {
            return new MyUploadAdapter( loader );
        };
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Angular 中向 ckeditor 添加简单的上传适配器 的相关文章

随机推荐

  • SQLite:结束事务花费的时间太长

    我正在事务中插入几行 但是 当我执行 END TRANSACTION 时 执行时间约为 250 毫秒 而 BEGIN TRANSACTION 则几乎不需要 1 毫秒左右 我需要加快这里的速度以适应我的应用程序 我怎么能够 编辑 单线程正在访
  • SSL:CERTIFICATE_VERIFY_FAILED 证书验证失败:自签名证书(_ssl.c:1129)

    我正在尝试自动创建受信任的证书和非对称密钥 然后执行自动安装过程 目前 所有这些都是使用 OpenSSL 实用程序手动完成的 我正在使用 Cryptography io 库来实现此自动化 并尝试使用代码生成的证书连接到服务器 当我调用 Po
  • Symfony2 - 从编译器通道访问内核

    有没有办法从编译器通道内部访问内核 我试过这个 public function process ContainerBuilder container kernel container gt get kernel 这会引发错误 还有其他方法吗
  • 是否可以从 Silverlight / C# 调用 matlab 函数?

    是否可以从 Silverlight C 调用 matlab 函数 如果您有一个可以解释 Mathlab 调用的程序集 dll 您应该能够将该程序集包含在您的项目中 并将其与应用程序的其余部分一起编译 显然 您将无法并行运行 Silverli
  • 为什么我的 Android ListAdapter 只显示一项?

    在我的 Android 应用程序中 我正在尝试构建我的第一个自定义列表适配器 我现在设法让它显示一项 但不幸的是 列表中有 8 个项目时 只能显示一项 我的适配器如下所示 public class PossibilitiesAdapter
  • 如何为自定义数组类型重载 Base.show ?

    假设我用它自己的自定义来制作我自己的自定义向量类型show method struct MyVector T lt AbstractVector T v Vector T end function Base show io IO v MyV
  • 如何访问 tf.data.Dataset.list_files() 收集的文件名?

    我在用 file data tf data Dataset list files png 收集图像文件以在 TensorFlow 中进行训练 但希望访问收集的文件名列表 以便执行标签查找 调用 sess run file data 一直不成
  • 将巨大的模型对象保存到文件中

    假设您有一个从 VAR 回归操作返回的 varrest 类模型对象 我想将模型保存到文件中 但不是用于估计系数的所有数据 如何只保存模型规范而不保存训练数据 因为当我保存模型时 它的文件大小超过 1GB 因此加载确实需要时间 可以保存没有某
  • 如何在 Python C-API 中动态创建派生类型

    假设我们有类型Noddy如定义在为 Python 编写 C 扩展模块的教程 http docs python org extending newtypes html adding data and methods to the basic
  • Ruby on Rails 3.2 编译资源无法正常工作

    这是 Rails 资产中的错误吗 我不明白我做错了什么 你能帮忙吗 我不想进行按需编译 The bug Started GET for 127 0 0 1 at 2012 02 02 01 25 44 0200 Processing by
  • SQL SSRS 报告管理器站点每次都要求登录

    SQL Server 2012 SSRS Windows 2008 R2 当尝试通过 URL 访问报告管理器时 http 服务器名称 报告 http servername reports 它提示我们输入用户名和密码 当我输入有效的用户 密码
  • ActiveMQ:在没有代理的情况下启动消费者

    我正在编写一个从队列消费的 JMS 客户端 如果重要的话 我的经纪人是 activemq 一项要求是 即使代理关闭 客户端也应该启动 在这种情况下 它的行为应该就像队列中没有消息一样 一旦代理启动并且消息开始出现 就会做出相应的行为 问题是
  • 删除第一个 git 提交

    我第一次犯错的时候就犯了一个错误 我在另一个人的计算机上 并使用他们的用户名而不是我的用户名推送了一个版本 我怎样才能删除这个 您可以使用以下命令将包含您想要的初始提交的存储库强制推送到 Githubgit push force
  • 是否有任何 HTML 代码可以显示椭圆形或圆角矩形?

    我不确定 HTML 中是否可以 但我仍然会在这里问 是否有任何 HTML 代码可以代表椭圆或圆角矩形 换个角度想 这也是很有可能的 就这样 http virkkunen net b oh dear html http virkkunen n
  • 自动释放:当你被 NARC 逮捕时总是使用吗?

    我知道这个问题看起来像一个骗局 我检查过 但事实并非如此 在谈论 NARC 时 该博客的作者说 http vgable com blog 2010 05 19 n a r c 就我个人而言 我喜欢在同一行立即自动释放我 NARC 编辑的任何
  • 带有 html5 的图像按钮

    我正在尝试制作一个图像按钮 我正在使用 学习 html5 和 jquery mobile 这是我的示例代码 img src img beer png alt beer
  • 检查 bash 脚本中 C 程序的返回值?

    我有一个 bash 脚本 在其中使用 检查上次运行命令的退出代码变量 但现在我正在执行一个 C 程序 来自该脚本 如果程序成功执行 则返回 0 有什么方法可以在我的 bash 脚本中捕获 C 程序的返回值吗 我相信 awk sed 等不同的
  • jQuery 解析/显示来自 php json_encode 的 json 数据

    jquery 中的初始 ajax 调用 ajax type post url items data php data id id dataType json success function data if data make item r
  • 我怎样才能拥有一个同时包含图像和文本的 UIBarButtonItem?

    当我尝试对 UIBarButtonItem 使用图像时 不显示文本 有没有办法同时显示文字和图像 您可以使用具有图像和文本的自定义视图来初始化 UIBarButtonItem 这是一个使用 UIButton 的示例 UIImage chat
  • 在 Angular 中向 ckeditor 添加简单的上传适配器

    我确实通过安装在我的角度项目中启动了经典的ckeditor npm install save ckeditor ckeditor5 angular npm install save ckeditor ckeditor5 build clas