Search code examples
vue.jsckeditor

vue.js using CKEditor from source, V-model not working as expected


when I create vue projects using CKEditor from source, I can add plugins for CKEditor. but the editor components V-model not working as expected. The ClassicEditor can't edit and no data update.it's a bug?

vue.config.js

const path = require('path')
const CKEditorWebpackPlugin = require('@ckeditor/ckeditor5-dev-webpack-plugin')
const { styles } = require('@ckeditor/ckeditor5-dev-utils')

module.exports = {
    transpileDependencies: [/ckeditor5-[^/\\]+[/\\]src[/\\].+\.js$/],
    configureWebpack: {
        plugins: [
            new CKEditorWebpackPlugin({
                language: 'zh-cn',

                translationsOutputFile: /app/,
            }),
        ],
    },
    chainWebpack: (config) => {
        const svgRule = config.module.rule('svg')

        svgRule.exclude.add(path.join(__dirname, 'node_modules', '@ckeditor'))

        config.module
            .rule('cke-svg')
            .test(/ckeditor5-[^/\\]+[/\\]theme[/\\]icons[/\\][^/\\]+\.svg$/)
            .use('raw-loader')
            .loader('raw-loader')

        config.module
            .rule('cke-css')
            .test(/ckeditor5-[^/\\]+[/\\].+\.css$/)
            .use('postcss-loader')
            .loader('postcss-loader')
            .tap(() => {
                return styles.getPostCssConfig({
                    themeImporter: {
                        themePath: require.resolve('@ckeditor/ckeditor5-theme-lark'),
                    },
                    minify: true,
                })
            })
    },

    css: {
        loaderOptions: {
            less: {
                lessOptions: {
                    modifyVars: {
                        'primary-color': '#fecf44',
                        'danger-color': '#1890ff',
                        'link-color': '#1890ff',
                    },
                    javascriptEnabled: true,
                },
            },
        },
    },
}


package.json

{
    "name": "dev.note.editor",
    "version": "0.1.0",
    "private": true,
    "scripts": {
        "serve": "vue-cli-service serve",
        "build": "vue-cli-service build"
    },
    "dependencies": {
        "@ckeditor/ckeditor5-alignment": "^21.0.0",
        "@ckeditor/ckeditor5-autoformat": "^21.0.0",
        "@ckeditor/ckeditor5-basic-styles": "^21.0.0",
        "@ckeditor/ckeditor5-block-quote": "^21.0.0",
        "@ckeditor/ckeditor5-build-classic": "^21.0.0",
        "@ckeditor/ckeditor5-ckfinder": "^21.0.0",
        "@ckeditor/ckeditor5-code-block": "^21.0.0",
        "@ckeditor/ckeditor5-dev-utils": "^23.2.0",
        "@ckeditor/ckeditor5-dev-webpack-plugin": "^23.2.0",
        "@ckeditor/ckeditor5-editor-classic": "^21.0.0",
        "@ckeditor/ckeditor5-editor-decoupled": "^21.0.0",
        "@ckeditor/ckeditor5-essentials": "^21.0.0",
        "@ckeditor/ckeditor5-export-pdf": "^1.0.0",
        "@ckeditor/ckeditor5-export-word": "^0.0.2",
        "@ckeditor/ckeditor5-font": "^21.0.0",
        "@ckeditor/ckeditor5-heading": "^21.0.0",
        "@ckeditor/ckeditor5-highlight": "^21.0.0",
        "@ckeditor/ckeditor5-horizontal-line": "^21.0.0",
        "@ckeditor/ckeditor5-image": "^21.0.0",
        "@ckeditor/ckeditor5-indent": "^21.0.0",
        "@ckeditor/ckeditor5-link": "^21.0.0",
        "@ckeditor/ckeditor5-list": "^21.0.0",
        "@ckeditor/ckeditor5-media-embed": "^21.0.0",
        "@ckeditor/ckeditor5-mention": "^21.0.0",
        "@ckeditor/ckeditor5-page-break": "^21.0.0",
        "@ckeditor/ckeditor5-paragraph": "^21.0.0",
        "@ckeditor/ckeditor5-paste-from-office": "^21.0.0",
        "@ckeditor/ckeditor5-remove-format": "^21.0.0",
        "@ckeditor/ckeditor5-restricted-editing": "^21.0.0",
        "@ckeditor/ckeditor5-special-characters": "^21.0.0",
        "@ckeditor/ckeditor5-table": "^21.0.0",
        "@ckeditor/ckeditor5-theme-lark": "^21.0.0",
        "@ckeditor/ckeditor5-upload": "^21.0.0",
        "@ckeditor/ckeditor5-vue": "^1.0.1",
        "@ckeditor/ckeditor5-watchdog": "^21.0.0",
        "@ckeditor/ckeditor5-word-count": "^21.0.0",
        "@wiris/mathtype-ckeditor5": "^7.22.0",
        "ant-design-vue": "^1.6.4",
        "axios": "^0.19.2",
        "core-js": "^3.6.5",
        "js-cookie": "^2.2.1",
        "postcss-loader": "3",
        "raw-loader": "0.5.1",
        "vue": "^2.6.11",
        "vue-router": "^3.2.0",
        "vuex": "^3.4.0"
    },
    "devDependencies": {
        "@vue/cli-plugin-babel": "~4.5.0",
        "@vue/cli-plugin-router": "~4.5.0",
        "@vue/cli-plugin-vuex": "~4.5.0",
        "@vue/cli-service": "~4.5.0",
        "less-loader": "^6.2.0",
        "vue-template-compiler": "^2.6.11"
    }
}

App.vue

<template>
    <div id="app">
        <ckeditor :editor="editor" v-model="editorData" :config="editorConfig"></ckeditor>
    </div>
</template>

<script>
import ClassicEditor from "@ckeditor/ckeditor5-editor-classic/src/classiceditor";

export default {
    data() {
        return {
            editor: ClassicEditor,
            editorData: "<p>Content of the editor.</p>",
            editorConfig: {},
        };
    },
};
</script>

main.js

import Vue from 'vue'
import CKEditor from '@ckeditor/ckeditor5-vue'
import App from './App.vue'
import router from './router'
import store from './store'

import '@/assets/less/style.less'

Vue.config.productionTip = false

Vue.use(CKEditor)

new Vue({
    router,
    store,
    render: (h) => h(App),
}).$mount('#app')

Solution

  • After testing, I found that EssentialsPlugin must be import.

    App.vue

    <template>
        <div id="app">
            <ckeditor :editor="editor" v-model="editorData" :config="editorConfig"></ckeditor>
        </div>
    </template>
    
    <script>
    import CKEditor from "@ckeditor/ckeditor5-vue";
    import ClassicEditor from "@ckeditor/ckeditor5-editor-classic/src/classiceditor";
    
    import Heading from "@ckeditor/ckeditor5-heading/src/heading";
    import Autoformat from "@Îckeditor/ckeditor5-autoformat/src/autoformat";
    // Must be import
    import EssentialsPlugin from "@ckeditor/ckeditor5-essentials/src/essentials";
    
    export default {
        components: {
            ckeditor: CKEditor.component,
        },
        data() {
            return {
                demo: "",
                editor: ClassicEditor,
                editorData: "<p>Content of the editor.</p>",
                editorConfig: {
                    plugins: [Heading, Autoformat, EssentialsPlugin],
                    toolbar: {
                        items: ["heading"],
                    },
                    title: {
                        placeholder: "My custom placeholder for the title",
                    },
                    placeholder: "My custom placeholder for the body",
                },
            };
        },
    };
    </script>