UNPKG

@ribajs/core

Version:

Core module of Riba.js

218 lines 15.5 kB
import { View } from "../view.js"; import { Riba } from "../riba.js"; import { BasicComponent } from "./basic-component.js"; import { EventDispatcher } from "@ribajs/events"; export class Component extends BasicComponent { view = null; riba; _binds = false; _bound = false; _connected = false; _disconnected = false; lifecycleEvents = EventDispatcher.getInstance("lifecycle"); lifecycleOptions = {}; get binds() { return this._binds; } get bound() { return this._bound; } get connected() { return this._connected; } get disconnected() { return this._disconnected; } autobind = true; constructor() { super(); this.lifecycleEvents.trigger("Component:constructor", this.getLifecycleEventData()); this.lifecycleEvents.on("ComponentLifecycle:allBound", this.afterAllBind, this); } async init(observedAttributes) { try { await super.init(observedAttributes); this.lifecycleEvents.trigger("Component:init", this.getLifecycleEventData()); return await this.bindIfReady(); } catch (error) { this.throw(error); } } throw(error) { if (error.message) { console.error(`[${this.tagName}] ${error.message}`); } this.lifecycleEvents.trigger("Component:error", error, this.getLifecycleEventData()); this.error(error); } async bindIfReady() { if (this.ready()) { await this.beforeTemplate(); const template = await this.loadTemplate(); await this.afterTemplate(template); if (this.autobind) { await this.bind(); } await this.onReady(); return; } this.debug(`Not all required or passed attributes are set to load and bind the template`, this.observedAttributesToCheck, this.scope); return; } async _beforeBind() { this._binds = true; this.debug("Start to bind Riba"); this.lifecycleEvents.trigger("Component:beforeBind", this.getLifecycleEventData()); } async beforeBind() { } async _afterBind() { this._binds = false; this._bound = true; this.lifecycleEvents.trigger("Component:afterBind", this.getLifecycleEventData()); } async afterBind() { } async afterAllBind() { } getLifecycleEventData() { const data = { tagName: this.tagName.toLowerCase(), component: this, options: this.lifecycleOptions, }; return data; } disconnectedCallback() { try { this._disconnected = true; this._connected = false; super.disconnectedCallback(); this.lifecycleEvents.trigger("Component:disconnected", this.getLifecycleEventData()); this.lifecycleEvents.off("ComponentLifecycle:allBound", this.afterAllBind, this); this.lifecycleEvents.off("ComponentLifecycle:error", this.afterAllBind, this); } catch (error) { this.throw(error); } } connectedCallback() { try { this._disconnected = false; this._connected = true; super.connectedCallback(); this.lifecycleEvents.trigger("Component:connected", this.getLifecycleEventData()); } catch (error) { this.throw(error); } } async attributeChangedCallback(attributeName, oldValue, newValue, namespace) { try { super.attributeChangedCallback(attributeName, oldValue, newValue, namespace); await this.bindIfReady(); } catch (error) { this.throw(error); } } callFormatterHandler(self) { return { name: "call", read: (fn, ...args) => { if (!fn) { throw new Error(`[${self.tagName}] Can not use "call" formatter: fn is undefined!`); } return fn.apply(self, args); }, }; } argsFormatterHandler(self) { return { name: "args", read: (fn, ...fnArgs) => { return (event, scope, el, binding) => { if (!fn) { throw new Error(`[${self.tagName}] Can not use "args" formatter: fn is undefined!`); } fnArgs.push(event); fnArgs.push(scope); fnArgs.push(el); fnArgs.push(binding); return fn.apply(self, fnArgs); }; }, }; } async bind() { if (this.binds || this.bound) { return this.view; } if (!this.checkRequiredAttributes()) { this.debug("Not all required attributes are set for bind"); return; } try { await this._beforeBind(); await this.beforeBind(); this.riba = new Riba(); this.view = this.getView(); if (this.view) { this.scope = this.view.models; this.view.bind(); } await this._afterBind(); await this.afterBind(); } catch (error) { this._binds = false; this._bound = false; this.throw(error); } return this.view; } getView() { try { const viewOptions = this.riba?.getViewOptions({ handler: this.eventHandler(this), formatters: { call: this.callFormatterHandler(this), args: this.argsFormatterHandler(this), }, }); if (viewOptions) { const view = new View(Array.prototype.slice.call(this.childNodes), this.scope, viewOptions); return view; } return null; } catch (error) { this.throw(error); } } async unbind() { try { if (this.view) { this._binds = false; this._bound = false; this.view.unbind(); this.view = null; } } catch (error) { this.throw(error); } } async build() { try { if (this.view) { this.view.build(); } } catch (error) { this.throw(error); } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudC9jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNsQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWxDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFNakQsTUFBTSxPQUFnQixTQUFVLFNBQVEsY0FBYztJQUMxQyxJQUFJLEdBQWlCLElBQUksQ0FBQztJQUMxQixJQUFJLENBQVE7SUFFWixNQUFNLEdBQUcsS0FBSyxDQUFDO0lBRWYsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUVmLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFFbkIsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUN0QixlQUFlLEdBQUcsZUFBZSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUUzRCxnQkFBZ0IsR0FBOEIsRUFBRSxDQUFDO0lBRzNELElBQVcsS0FBSztRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBR0QsSUFBVyxLQUFLO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFHRCxJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFHRCxJQUFXLFlBQVk7UUFDckIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFLUyxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBRTFCO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FDMUIsdUJBQXVCLEVBQ3ZCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUM3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