Typedef

SchemaCheckAttributeEvent (engine/model)

@ckeditor/ckeditor5-engine/src/model/schema

typedefobject

Event fired when the checkAttribute method is called. It allows plugging in additional behavior, for example implementing rules which cannot be defined using the declarative SchemaItemDefinition interface.

Note: The addAttributeCheck method is a more handy way to register callbacks. Internally, it registers a listener to this event but comes with a simpler API and it is the recommended choice in most of the cases.

The checkAttribute method fires an event because it is decorated with it. Thanks to that you can use this event in various ways, but the most important use case is overriding the standard behavior of the checkAttribute() method. Let's see a typical listener template:

schema.on( 'checkAttribute', ( evt, args ) => {
	const context = args[ 0 ];
	const attributeName = args[ 1 ];
}, { priority: 'high' } );

The listener is added with a high priority to be executed before the default method is really called. The args callback parameter contains arguments passed to checkAttribute( context, attributeName ). However, the context parameter is already normalized to a SchemaContext instance, so you do not have to worry about the various ways how context may be passed to checkAttribute().

So, in order to implement a rule "disallow bold in a text which is in a heading1, you can add such a listener:

schema.on( 'checkAttribute', ( evt, args ) => {
	const context = args[ 0 ];
	const attributeName = args[ 1 ];

	if ( context.endsWith( 'heading1 $text' ) && attributeName == 'bold' ) {
		// Prevent next listeners from being called.
		evt.stop();
		// Set the checkAttribute()'s return value.
		evt.return = false;
	}
}, { priority: 'high' } );

Allowing attributes in specific contexts will be a far less common use case, because it is normally handled by the allowAttributes rule from SchemaItemDefinition. But if you have a complex scenario where bold should be allowed only in element foo which must be in element bar, then this would be the way:

schema.on( 'checkAttribute', ( evt, args ) => {
	const context = args[ 0 ];
	const attributeName = args[ 1 ];

	if ( context.endsWith( 'bar foo $text' ) && attributeName == 'bold' ) {
		// Prevent next listeners from being called.
		evt.stop();
		// Set the checkAttribute()'s return value.
		evt.return = true;
	}
}, { priority: 'high' } );

Filtering

Properties

  • args : tuple

  • name : 'checkAttribute'

Fired by