Как я могу ограничить свой собственный элемент, чтобы содержать только простой текст? - PullRequest
0 голосов
/ 31 октября 2018

Как мне создать блочный элемент, который может содержать только простой текст? (Без жирного, курсива и т. Д.).

Я зарегистрировал свой элемент как:

model.schema.register(mtHeaderLine, {
   // Changing inheritAllFrom to '$block' creates an editable element
   // but then it can contain bold text.
   inheritAllFrom: '$text',  
   allowIn: mtHeaderDiv,
   isBlock: true
});

А потом я опустился с:

editor.conversion.for('downcast').add(downcastElementToElement( { model: mtHeaderLine, view: 'div' }

Но это создает элемент, который я не могу редактировать.

Я также пытался опустить руки:

view: (modelElement, viewWriter ) => { 
    const viewElement=viewWriter.createEditableElement('div',{ 'class': (mtHeaderLine) ,isghost: isGhost });
    return viewElement;
}

Но это также не дало мне редактируемый элемент.

1 Ответ

0 голосов
/ 05 ноября 2018

Вам нужно использовать Schema#addAttributeCheck(). Этот метод позволяет зарегистрировать обратный вызов, который запрещает все атрибуты в $text, который в некотором контексте (например, дочерний элемент элемента модели <plaintext>):

function MyPlugin( editor ) {
    editor.model.schema.register( 'plaintext', {
        inheritAllFrom: '$block'
    } );

    editor.model.schema.addAttributeCheck( ( ctx, attrName ) => {
        if ( ctx.endsWith( 'plaintext $text' ) ) {
            return false;
        }
    } );

    editor.conversion.elementToElement( {
        model: 'plaintext',
        view: 'div'
    } );
}

ClassicEditor
    .create( document.getElementById( 'editor' ), {
        plugins: [ ...ClassicEditor.builtinPlugins, MyPlugin ]
    } )
    .then( editor => {
        window.editor = editor;
    } )
    .catch( error => {
        console.error( error );
    } );

ДЕМО: https://jsfiddle.net/rvas7pLn/1/

...