Определение схемы
Прежде всего, вам нужно убедиться, что <image>
разрешено в элементе вашей пользовательской модели. Если вы зарегистрировали это так:
editor.model.schema.register( 'custom', {
allowContentOf: '$root',
allowWhere: '$block'
} );
Тогда ты в порядке. Поскольку <$root>
позволяет <image>
внутри, ваш <custom>
позволит <image>
.
Подробнее о написании правил схемы можно прочитать в руководстве Глубокое погружение схемы .
Структура модели
Теперь вы спросили, как установить заголовок изображения. Чтобы понять это, вам нужно спросить, какова структура изображений в модели. Ответ будет - он сильно отличается от того, что вы имеете в виду:
<image src="...">
<caption>Caption text</caption>
</image>
Это структура, которую вы хотите создать, чтобы вставить изображение с подписью.
Вставка изображения в заданном месте
Лучший способ вставить произвольный контент - это editor.model.insertContent()
, потому что он заботится о двух вещах:
- установка выбора документа в желаемое (по крайней мере, из случаев, подобных вставке) место после вставки,
- убедившись, что содержимое, которое он вставляет, вставлено в место, разрешенное схемой (поэтому нам нужно сначала настроить схему).
Методы записи модели не делают ничего из этого, поэтому, если вы точно не знаете, куда следует вставить изображение и как вы хотите установить выделение, не используйте их.
Итак, как использовать insertContent()
?
editor.model.change( writer => {
const image = writer.createElement( 'image', { src: '...' } );
const caption = writer.createElement( 'caption' );
writer.appendText( 'Caption text', caption );
writer.append( caption, image );
// Option 1: If you have the <custom> element by reference:
const positionInCustom = Position.createAt( customElement, 0 );
editor.model.insertContent( image, positionInCustom );
// In this case, we still have to set the selection because we haven't
// passed document selection to `insertContent()` but a specific position.
writer.setSelection( image, 'on' );
// Option 2: Assuming that the document selection is somewhere
// in your <custom> element you might do this (image will be inserted
// at the document selection position):
editor.model.insertContent( image );
} );
См. Документацию editor.model.insertContent()
для получения дополнительной информации о различных способах ее использования.