代码之家  ›  专栏  ›  技术社区  ›  MTilsted

使用编辑器5中的文本创建不可编辑的块

  •  1
  • MTilsted  · 技术社区  · 7 年前

    如何在CKEditor 5中创建包含文本的不可编辑块。

    <div>Non editable message here</div>
    

    仅供参考:她是我最后使用的插件。

    import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
    import DecoupledEditor from '@ckeditor/ckeditor5-editor-decoupled/src/decouplededitor';
    import Essentials from '@ckeditor/ckeditor5-essentials/src/essentials';
    import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph';
    import Bold from '@ckeditor/ckeditor5-basic-styles/src/bold';
    import Heading from '@ckeditor/ckeditor5-basic-styles/src/bold';
    import Italic from '@ckeditor/ckeditor5-basic-styles/src/italic';
    import ButtonView from '@ckeditor/ckeditor5-ui/src/button/buttonview';
    import imageIcon from '@ckeditor/ckeditor5-core/theme/icons/image.svg';
    import Command from '@ckeditor/ckeditor5-core/src/command';
    import { downcastElementToElement,downcastAttributeToAttribute,downcastAttributeToElement } from '@ckeditor/ckeditor5-engine/src/conversion/downcast-converters';
    import { upcastElementToElement, upcastAttributeToAttribute,modelToViewAttributeConverter} from '@ckeditor/ckeditor5-engine/src/conversion/upcast-converters';
    import attachPlaceholder from "@ckeditor/ckeditor5-engine/src/view/placeholder";
    import ViewPosition from '@ckeditor/ckeditor5-engine/src/view/position';
    import toWidgetEditable from '@ckeditor/ckeditor5-widget/src/utils';
    import ClickObserver from '@ckeditor/ckeditor5-engine/src/view/observer/clickobserver';
    import UpcastDispatcher from '@ckeditor/ckeditor5-engine/src/conversion/upcastdispatcher'; 
    import { toWidget } from '@ckeditor/ckeditor5-widget/src/utils';
    
    export default class TestWidget2 extends Plugin {
        static get pluginName() {
            return 'TestWidget2';
        }
    
        init() {
            console.log('TestWidget2::init()');
            const editor=this.editor;
            const model=editor.model;
    
            model.schema.register( 'myWidget', {
                inheritAllFrom: '$block',
                isObject: true
            } );
    
            editor.conversion.for( 'dataDowncast' )
                .add( downcastElementToElement( {
                    model: 'myWidget',
                    view: ( modelItem, writer ) => {
                        const elm=writer.createContainerElement( 'div', { class: 'widget' } );
                        return toWidget( div, writer, { label: 'widget label' } );
                    }
                } ) );
    
            editor.conversion.for( 'editingDowncast' )
                .add( downcastElementToElement( {
                    model: 'myWidget',
                    view: ( modelItem, writer ) => {
                        const div = writer.createContainerElement( 'div', { class: 'widget' } );
    
                        return toWidget( div, writer, { label: 'widget label' } );
                    }
                } ) );
    
            editor.conversion.for( 'upcast' )
                .add( upcastElementToElement( {
                    view: {
                        name: 'div',
                        class: 'widget'
                    },
                    model: 'myWidget'
                } ) );
        }
    }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Reinmar    7 年前

    您可以创建 widget API

    import Widget from '@ckeditor/ckeditor5-widget/src/widget';
    import { toWidget } from '@ckeditor/ckeditor5-widget/src/utils';
    import { downcastElementToElement } from '@ckeditor/ckeditor5-engine/src/conversion/downcast-converters';
    import { upcastElementToElement } from '@ckeditor/ckeditor5-engine/src/conversion/upcast-converters';
    
    ClassicEditor
        .create( document.querySelector( '#editor' ), {
            plugins: [ Essentials, Paragraph, Widget, /* ... other plugins ... */ ],
            toolbar: [ 'undo', 'redo' ]
        } )
        .then( editor => {
            window.editor = editor;
    
            const model = editor.model;
    
            model.schema.register( 'myWidget', {
                inheritAllFrom: '$block',
                isObject: true
            } );
    
            editor.conversion.for( 'dataDowncast' )
                .add( downcastElementToElement( {
                    model: 'myWidget',
                    view: ( modelItem, writer ) => {
                        return writer.createContainerElement( 'div', { class: 'widget' } );
                    }
                } ) );
    
            editor.conversion.for( 'editingDowncast' )
                .add( downcastElementToElement( {
                    model: 'myWidget',
                    view: ( modelItem, writer ) => {
                        const div = writer.createContainerElement( 'div', { class: 'widget' } );
    
                        return toWidget( div, writer, { label: 'widget label' } );
                    }
                } ) );
    
            editor.conversion.for( 'upcast' )
                .add( upcastElementToElement( {
                    view: {
                        name: 'div',
                        class: 'widget'
                    },
                    model: 'myWidget'
                } ) );
    
            editor.setData(
                '<p>foobar</p>' +
                '<div class="widget">Non editable text goes here</div>' +
                '<p>foobar</p>'
            );
        } )
        .catch( err => {
            console.error( err.stack );
        } );
    

    toWidget() 将元素向下投射到编辑视图时的函数。此外,该元素应标记为 schema

    也不要忘记加载 Widget

        2
  •  -1
  •   JHOAN B. HENRICHE    7 年前

    根据文件 isReadOnly : Boolean 把它设为真。 Official Documentation

    推荐文章