@webqit/oohtml
Version:
A suite of new DOM features that brings language support for modern UI development paradigms: a component-based architecture, data binding, and reactivity.
57 lines (48 loc) • 1.84 kB
JavaScript
/**
* @imports
*/
import DOMContext from '../context-api/DOMContext.js';
import { env } from '../util.js';
export default class DOMBindingsContext extends DOMContext {
static kind = 'bindings';
/**
* @createRequest
*/
static createRequest( detail = null ) {
const request = super.createRequest();
if ( detail?.startsWith( '@' ) ) {
const [ targetContext, ...detail ] = detail.slice( 1 ).split( '.' ).map( s => s.trim() );
request.targetContext = targetContext;
request.detail = detail.join( '.' );
} else { request.detail = detail; }
return request;
}
/**
* @bindingsObj
*/
get bindingsObj() { return this.host[ this.configs.BINDINGS_API.api.bindings ]; }
/**
* @matchesEvent
*/
matchEvent( event ) {
return super.matchEvent( event )
&& ( !event.detail || !this.detail || ( Array.isArray( event.detail ) ? event.detail[ 0 ] === this.detail : event.detail === this.detail ) );
}
/**
* @handle()
*/
handle( event ) {
// Any existing event.meta.controller? Abort!
event.meta.controller?.abort();
if ( !( event.detail + '' ).trim() ) return event.respondWith( this.bindingsObj );
const { window: { webqit: { Observer } } } = env;
event.meta.controller = Observer.reduce( this.bindingsObj, Array.isArray( event.detail ) ? event.detail : [ event.detail ], Observer.get, descriptor => {
if ( this.disposed ) return; // If already scheduled but aborted as in provider unmounting
event.respondWith( descriptor.value );
}, { live: event.live, signal: event.signal, descripted: true } );
}
/**
* @unsubscribed()
*/
unsubscribed( event ) { event.meta.controller?.abort(); }
}