@ribajs/core
Version:
Core module of Riba.js
218 lines • 15.5 kB
JavaScript
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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