UNPKG

@syncfusion/ej2-base

Version:

A common package of Essential JS 2 base libraries, methods and class definitions

215 lines (214 loc) 8.4 kB
/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types */ import { isNullOrUndefined, getValue, extend, isBlazor } from './util'; var Observer = /** @class */ (function () { function Observer(context) { this.ranArray = []; this.boundedEvents = {}; if (isNullOrUndefined(context)) { return; } this.context = context; } /** * To attach handler for given property in current context. * * @param {string} property - specifies the name of the event. * @param {Function} handler - Specifies the handler function to be called while event notified. * @param {Object} context - Specifies the context binded to the handler. * @param {string} id - specifies the random generated id. * @returns {void} */ Observer.prototype.on = function (property, handler, context, id) { if (isNullOrUndefined(handler)) { return; } var cntxt = context || this.context; if (this.notExist(property)) { this.boundedEvents["" + property] = [{ handler: handler, context: cntxt, id: id }]; return; } if (!isNullOrUndefined(id)) { if (this.ranArray.indexOf(id) === -1) { this.ranArray.push(id); this.boundedEvents["" + property].push({ handler: handler, context: cntxt, id: id }); } } else if (!this.isHandlerPresent(this.boundedEvents["" + property], handler)) { this.boundedEvents["" + property].push({ handler: handler, context: cntxt }); } }; /** * To remove handlers from a event attached using on() function. * * @param {string} property - specifies the name of the event. * @param {Function} handler - Optional argument specifies the handler function to be called while event notified. * @param {string} id - specifies the random generated id. * @returns {void} ? */ Observer.prototype.off = function (property, handler, id) { if (this.notExist(property)) { return; } var curObject = getValue(property, this.boundedEvents); if (handler) { for (var i = 0; i < curObject.length; i++) { if (id) { if (curObject[parseInt(i.toString(), 10)].id === id) { curObject.splice(i, 1); var indexLocation = this.ranArray.indexOf(id); if (indexLocation !== -1) { this.ranArray.splice(indexLocation, 1); } break; } } else if (handler === curObject[parseInt(i.toString(), 10)].handler) { curObject.splice(i, 1); break; } } } else { delete this.boundedEvents["" + property]; } }; /** * To notify the handlers in the specified event. * * @param {string} property - Specifies the event to be notify. * @param {Object} argument - Additional parameters to pass while calling the handler. * @param {Function} successHandler - this function will invoke after event successfully triggered * @param {Function} errorHandler - this function will invoke after event if it was failure to call. * @returns {void} ? */ Observer.prototype.notify = function (property, argument, successHandler, errorHandler) { if (this.notExist(property)) { if (successHandler) { successHandler.call(this, argument); } return; } if (argument) { argument.name = property; } var blazor = 'Blazor'; var curObject = getValue(property, this.boundedEvents).slice(0); if (window["" + blazor]) { return this.blazorCallback(curObject, argument, successHandler, errorHandler, 0); } else { for (var _i = 0, curObject_1 = curObject; _i < curObject_1.length; _i++) { var cur = curObject_1[_i]; cur.handler.call(cur.context, argument); } if (successHandler) { successHandler.call(this, argument); } } }; Observer.prototype.blazorCallback = function (objs, argument, successHandler, errorHandler, index) { var _this = this; var isTrigger = index === objs.length - 1; if (index < objs.length) { var obj_1 = objs[parseInt(index.toString(), 10)]; var promise = obj_1.handler.call(obj_1.context, argument); if (promise && typeof promise.then === 'function') { if (!successHandler) { return promise; } promise.then(function (data) { data = typeof data === 'string' && _this.isJson(data) ? JSON.parse(data, _this.dateReviver) : data; extend(argument, argument, data, true); if (successHandler && isTrigger) { successHandler.call(obj_1.context, argument); } else { return _this.blazorCallback(objs, argument, successHandler, errorHandler, index + 1); } }).catch(function (data) { if (errorHandler) { errorHandler.call(obj_1.context, typeof data === 'string' && _this.isJson(data) ? JSON.parse(data, _this.dateReviver) : data); } }); } else if (successHandler && isTrigger) { successHandler.call(obj_1.context, argument); } else { return this.blazorCallback(objs, argument, successHandler, errorHandler, index + 1); } } }; Observer.prototype.dateReviver = function (key, value) { var dPattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/; if (isBlazor && typeof value === 'string' && value.match(dPattern) !== null) { return (new Date(value)); } return (value); }; Observer.prototype.isJson = function (value) { try { JSON.parse(value); } catch (e) { return false; } return true; }; /** * To destroy handlers in the event * * @returns {void} ? */ Observer.prototype.destroy = function () { this.boundedEvents = this.context = undefined; }; /** * To remove internationalization events * * @returns {void} ? */ Observer.prototype.offIntlEvents = function () { var eventsArr = this.boundedEvents['notifyExternalChange']; if (eventsArr) { for (var i = 0; i < eventsArr.length; i++) { var curContext = eventsArr[parseInt(i.toString(), 10)].context; if (curContext && curContext.detectFunction && curContext.randomId && curContext.isReactMock) { this.off('notifyExternalChange', curContext.detectFunction, curContext.randomId); i--; } } if (!this.boundedEvents['notifyExternalChange'].length) { delete this.boundedEvents['notifyExternalChange']; } } }; /** * Returns if the property exists. * * @param {string} prop ? * @returns {boolean} ? */ Observer.prototype.notExist = function (prop) { return Object.prototype.hasOwnProperty.call(this.boundedEvents, prop) === false || this.boundedEvents["" + prop].length <= 0; }; /** * Returns if the handler is present. * * @param {BoundOptions[]} boundedEvents ? * @param {Function} handler ? * @returns {boolean} ? */ Observer.prototype.isHandlerPresent = function (boundedEvents, handler) { for (var _i = 0, boundedEvents_1 = boundedEvents; _i < boundedEvents_1.length; _i++) { var cur = boundedEvents_1[_i]; if (cur.handler === handler) { return true; } } return false; }; return Observer; }()); export { Observer };