1. TinyMCE简介

TinyMCE是一个轻量级的富文本编辑器,相对于CKEditor更加精简,但足以满足绝大部分场景的需要。

2. 安装和配置TinyMCE

  • 2.1 安装TinyMCE

    npm install --save tinymce
  • 2.2 设置tinymce全局访问(.angular-cli.json)

    "scripts": [
         "../node_modules/_tinymce@4.7.4/tinymce.js","../node_modules/_tinymce@4.7.4/themes/modern/theme.js","../node_modules/_tinymce@4.7.4/plugins/link/plugin.js","../node_modules/_tinymce@4.7.4/plugins/paste/plugin.js","../node_modules/_tinymce@4.7.4/plugins/table/plugin.js"
     ],
  • 2.3 定义全局变量

    在项目中的typing.d.ts中声明tinymce全局变量,不然会提示找不到tinymce
    declare var tinymce: any;
  • 2.4 拷贝皮肤文件到assets目录下

    Linux and MacOS
    cp -r node_modules/tinymce/skins src/assets/skins
  • 2.5 安装中文支持

    中文语言包可以从这个地址下载:https://www.tinymce.com/downl...

    下载下来的压缩文件中会有一个langs目录,里面有zh_CN.js,把这个目录拷贝到src/assets目录下,然后在全局中添加引用(.angular-cli.json):
    "scripts": [

    "../node_modules/_tinymce@4.7.4/tinymce.js","../node_modules/_tinymce@4.7.4/plugins/table/plugin.js","../src/assets/langs/zh_CN.js"

    ],

3. 创建TinyMCE组件

ng g c myeditor
import {
    Component,AfterViewInit,EventEmitter,OnDestroy,Input,Output
} from '@angular/core';
import { HttpClient,HttpHeaders } from '@angular/common/http';

@Component({
    selector: 'tiny-editor',templateUrl: './tiny-editor.component.html',styleUrls: ['./tiny-editor.component.css']
})
export class TinyEditorComponent implements AfterViewInit,OnDestroy {
    @input() elementId: String;
    @Output() onEditorContentChange = new EventEmitter();

    editor;

    constructor() { }

    ngAfterViewInit() {
        let self = this;
        tinymce.init({
            selector: '#' + this.elementId,height: 600,plugins: ['link','table','image'],skin_url: 'assets/skins/lightgray',setup: editor => {
                this.editor = editor;
                editor.on('keyup change',() => {
                    const content = editor.getContent();
                    this.onEditorContentChange.emit(content);
                });
            }
        });
    }

    ngOnDestroy() {
        tinymce.remove(this.editor);
    }

}
// tiny-editor.component.html
<textarea id="{{elementId}}"></textarea>

4. 使用自定义TinyMCE组件

<tiny-editor [elementId]="'defined-tinymce-editor'"></tiny-editor>

5. 增加图片上传功能

import {
    Component,OnDestroy {
    @input() elementId: String;
    @Output() onEditorContentChange = new EventEmitter();

    editor;

    constructor(private http: HttpClient) { }

    ngAfterViewInit() {
        let self = this;
        tinymce.init({
            selector: '#' + this.elementId,() => {
                    const content = editor.getContent();
                    this.onEditorContentChange.emit(content);
                });
            },// 图片上传功能
            images_upload_handler: function(blobInfo,success,failure) {
                var formData;
                formData = new FormData();
                console.log(blobInfo);
                formData.append("file",blobInfo.blob(),blobInfo.filename());
                console.log(formData);
                self.uploadFile('http://www.seenode.com/index/player/upload',formData).subscribe( response => {
                    let url = response['data']['imagePath'];
                    success(url);
                });
            }
        });
    }

    // 上传图片
    private uploadFile(url: string,formData: any) {
        var self = this;
        var headers = new HttpHeaders();
        headers.set("Accept","application/json");
        return self.http.post(url,formData,{ headers: headers });
    }

    ngOnDestroy() {
        tinymce.remove(this.editor);
    }

}

6. 获取和设置编辑器内容

<tiny-editor 
    [elementId]="'defined-tinymce-editor'"
    (onEditorContentChange)="keyupHandler($event)"></tiny-editor>
// 监听onEditorKeyup事件
private keyupHandler(event) {
    console.log('编辑器的内容:',event);
}

Angular5 整合富文本编辑器TinyMCE汉化+上传的更多相关文章

  1. HTML5仿微信聊天界面、微信朋友圈实例代码

    小编最近开发一个基于html5开发的一个微信聊天前端界面,功能很全面,下面小编给大家分享实例代码,需要的朋友参考下

  2. android – 当应用程序强制关闭或设备重新启动时,共享首选项重置数据

    我正在开发一个应用程序,我在其中存储用户名和密码在SharedPreferences中.所有的东西都适合我,存储以及检索值.但我发现当我重启设备或强制关闭app时,SharedPreferences中存储的值会被重置.当我再次启动我的应用程序时,我在SharedPreferences键中获得空值.在这里,我正在做什么来存储值:而且,这就是我正在重温它的方式:到目前为止,所有的事情都很好.我再次说明我的问题,当我强制关闭或重启我的设备时,我得到空值.我们可以将它永久存储在应用程序内存中吗?

  3. android – 重置Preference的默认值

    我正在使用CheckBoxPreference进行设置屏幕.XML是:我在应用程序中更改了值.用户注销后,必须将其设置为xml中定义的默认值.但是,它似乎不起作用.他们保留我最后选择的那些价值观.阅读Android文档后,我发现了这个:但它几乎没有成功!使用SharedPreferences尝试其他方式.它也没用!我错过了什么吗?解决方法共享首选项应该有效,但您应该使用默认的共享首选项.要使用文件名获取共享首选项,Android会创建此名称(可能基于项目的包名称?

  4. android – 共享首选项仅保存第一次

    该程序第一次创建首选项,但之后它永远不会更改它们.我很感激帮助理解为什么.这是调用xml的PreferencesScreen.在首选项中,我有一个ListPreference和一个Preference,它调用一个活动来存储电子邮件.一切都在这里.问题出在所谓的……

  5. android – SharedPrefences未更新

    我有一个奇怪的问题,共享首选项在返回应用程序时没有被更新.这是场景:我有两个项目使用相同的共享首选项.Project1和Project2.它们是独立但相关的应用程序.他们使用相同的密钥进行签名,并使用sharedUserId来共享信息.Project1打开Project2.Project2检索SharedPreferences文件并通过以下方式写入:一旦完成,我通过调用finish()返回到Pro

  6. Android SharedPreferences限制?

    我在Android上开发了一款游戏.我目前正在保存数据库中的大部分游戏统计信息.但是,该应用程序不会在DB中使用多个单行.我现在有兴趣介绍一些新的统计数据,但这将导致我的数据库重新安装,从而清除每个人的进步.为了避免在将来的这个,我正在考虑存储游戏统计与SharedPreferences代替.我的问题是在成为问题之前可以将多少种不同的东西存储起来.总共我将存储大约40个值,所有的整数.解决方法Sh

  7. jQuery利用FormData上传文件实现批量上传

    这篇文章主要为大家详细介绍了jQuery利用FormData上传文件实现批量上传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  8. TinyMCE汉化及本地上传图片功能实例详解

    这篇文章主要介绍了TinyMCE汉化及本地上传图片功能实例详解的相关资料,由于我们下载下拉的是英文版,需要先汉化,比较简单,需要的朋友可以参考下

  9. vue-quill-editor富文本编辑器超详细入门使用步骤

    vue中很多项目都需要用到富文本编辑器,在使用了ueditor和tinymce后,发现并不理想,所以果断使用vue-quill-editor来实现,下面这篇文章主要给大家介绍了关于vue-quill-editor富文本编辑器入门使用步骤的相关资料,需要的朋友可以参考下

  10. thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例

    这篇文章主要介绍了thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json操作,结合实例形式分析了thinkphp5 + ajax 使用formdata提交数据、文件上传与后台返回json遇到的相关问题即解决方法,需要的朋友可以参考下

随机推荐

  1. Angular2 innerHtml删除样式

    我正在使用innerHtml并在我的cms中设置html,响应似乎没问题,如果我这样打印:{{poi.content}}它给了我正确的内容:``但是当我使用[innerHtml]=“poi.content”时,它会给我这个html:当我使用[innerHtml]时,有谁知道为什么它会剥离我的样式Angular2清理动态添加的HTML,样式,……

  2. 为Angular根组件/模块指定@Input()参数

    我有3个根组件,由根AppModule引导.你如何为其中一个组件指定@input()参数?也不由AppModalComponent获取:它是未定义的.据我所知,你不能将@input()传递给bootstraped组件.但您可以使用其他方法来做到这一点–将值作为属性传递.index.html:app.component.ts:

  3. angular-ui-bootstrap – 如何为angular ui-bootstrap tabs指令指定href参数

    我正在使用角度ui-bootstrap库,但我不知道如何为每个选项卡指定自定义href.在角度ui-bootstrap文档中,指定了一个可选参数select(),但我不知道如何使用它来自定义每个选项卡的链接另一种重新定义问题的方法是如何使用带有角度ui-bootstrap选项卡的路由我希望现在还不算太晚,但我今天遇到了同样的问题.你可以通过以下方式实现:1)在控制器中定义选项卡href:2)声明一个函数来改变控制器中的散列:3)使用以下标记:我不确定这是否是最好的方法,我很乐意听取别人的意见.

  4. 离子框架 – 标签内部的ng-click不起作用

    >为什么标签标签内的按钮不起作用?>但是标签外的按钮(登陆)工作正常,为什么?>请帮我解决这个问题.我需要在点击时做出回复按钮workingdemo解决方案就是不要为物品使用标签.而只是使用divHTML

  5. Angular 2:将值传递给路由数据解析

    我正在尝试编写一个DataResolver服务,允许Angular2路由器在初始化组件之前预加载数据.解析器需要调用不同的API端点来获取适合于正在加载的路由的数据.我正在构建一个通用解析器,而不是为我的许多组件中的每个组件设置一个解析器.因此,我想在路由定义中传递指向正确端点的自定义输入.例如,考虑以下路线:app.routes.ts在第一个实例中,解析器需要调用/path/to/resourc

  6. angularjs – 解释ngModel管道,解析器,格式化程序,viewChangeListeners和$watchers的顺序

    换句话说:如果在模型更新之前触发了“ng-change”,我可以理解,但是我很难理解在更新模型之后以及在完成填充更改之前触发函数绑定属性.如果您读到这里:祝贺并感谢您的耐心等待!

  7. 角度5模板形式检测形式有效性状态的变化

    为了拥有一个可以监听其包含的表单的有效性状态的变化的组件并执行某些组件的方法,是reactiveforms的方法吗?

  8. Angular 2 CSV文件下载

    我在springboot应用程序中有我的后端,从那里我返回一个.csv文件WheniamhittingtheURLinbrowsercsvfileisgettingdownloaded.现在我试图从我的角度2应用程序中点击此URL,代码是这样的:零件:服务:我正在下载文件,但它像ActuallyitshouldbeBook.csv请指导我缺少的东西.有一种解决方法,但您需要创建一个页面上的元

  9. angularjs – Angular UI-Grid:过滤后如何获取总项数

    提前致谢:)你应该避免使用jQuery并与API进行交互.首先需要在网格创建事件中保存对API的引用.您应该已经知道总行数.您可以使用以下命令获取可见/已过滤行数:要么您可以使用以下命令获取所选行的数量:

  10. angularjs – 迁移gulp进程以包含typescript

    或者我应该使用tsc作为我的主要构建工具,让它解决依赖关系,创建映射文件并制作捆绑包?

返回
顶部