Прослушивание события, запущенного при изменении содержимого в CKEditor 5
как я могу прослушать событие "input" в ckeditor5 ? Я хотел бы иметь возможность использовать Observables
такой:
Observable.fromEvent(this.editor, "input").debounceTime(250).subscribe(() => {});
до сих пор я был в состоянии слушать некоторые события, как это:
Observable.fromEvent(this.editor.editing.view, 'selectionChangeDone').subscribe(() => { });
но я не нахожу имя события, которое будет запущено, как только данные будут изменены в Редакторе. Я попытался "изменить", но он срабатывает только тогда, когда редактор получает или потерял фокус.
2 ответов
начиная с CKEditor5 v11.0.0 (с 21 июля 2018 года)
что ты наверное нужен Document#change:data
событие, вызванное документом редактора.
editor.model.document.on( 'change:data', () => {
console.log( 'The data has changed!' );
} );
это событие запускается, когда документ изменяется таким образом, который "виден" в данных редактора. Существует также группа изменений, таких как изменения позиции выбора, изменения маркера, которые не влияют на результат editor.getData()
. Чтобы слушать все эти изменения, вы можете использовать более широкий Document#change
событие:
editor.model.document.on( 'change', () => {
console.log( 'The Document has changed!' );
} );
до CKEditor5 v11.0.0
что ты наверное нужен change
событие, вызванное документом редактора.
editor.model.document.on( 'change', () => {
console.log( 'The Document has changed!' );
} );
как говорится в документации этого события:
уволен после каждого
enqueueChange()
блок или внешнейchange()
блок был выполнен, и документ был изменен во время этого блока исполнение.изменения, которые это событие будет охватывать, включают:
- изменения структуры документа,
- изменения выбора,
- изменения маркера.
если вы хотите получать уведомления обо всех этих изменениях, просто слушайте это событие следующим образом:
model.document.on( 'change', () => { console.log( 'The Document has changed!' ); } );
Если, однако, вы хотите получать уведомления только об изменениях структуры, проверьте, является ли differ содержит любые изменения:
model.document.on( 'change', () => { if ( model.document.differ.getChanges().length > 0 ) { console.log( 'The Document has changed!' ); } } );
последний фрагмент кода полезен при реализации таких функций, как автоматическое сохранение.
прежде всего, я вижу, что вы используете Observable.fromEvent
который, кажется, является частью RxJS и работает с событиями jQuery. CKEditor 5 не использует RxJS или jQuery. Он использует пользовательские события и пользовательские наблюдаемых которые чем-то отличаются от наблюдаемых, которые вы хотите использовать.
Итак, обратите внимание, что:
Observable.fromEvent(this.editor.editing.view, 'selectionChangeDone');
не является правильным способом прослушивания события и работает, скорее всего, только из-за некоторых утиной типизацией.
в правильный способ прослушивания событий CKE5:
this.editor.editing.view.on( 'selectionChangeDone', () => { /*...*/ } );
во-вторых, "ввод" - это не событие, а команда. Если вы хотите прослушать выполнение этой команды, вы можете сделать:
this.editor.commands.get( 'input' ).on( 'execute', ( evt, args ) => {
console.log( evt, args );
} );
однако это очень свежий API, который будет представлен в следующей версии ckeditor-core (0.9.0), поэтому вам нужно использовать текущую главную ветвь для ее использования.