StructureJS
0.15.2A class based utility library for building modular and scalable web platform applications. Features opt-in classes and utilities which provide a solid foundation and toolset to build your next project.
import DisplayObjectContainer from '../display/DisplayObjectContainer';
import DisplayObject from '../display/DisplayObject';
import Util from '../util/Util';
/**
* A helper class to create multiple instances of the same Component Class from jQuery object that has one or more elements in it.
*
* @class ComponentFactory
* @module StructureJS
* @submodule util
* @author Robert S. (www.codeBelt.com)
* @static
*/
class ComponentFactory
{
constructor()
{
throw new Error('[ComponentFactory] Do not instantiate the ComponentFactory class because it is a static class.');
}
/**
* Takes a jQuery object that has one or more elements in it and passes a single jQuery element into the constructor of the class that is also being passed in.
*
* @method create
* @param $element {jQuery} One or more jQuery referenced DOM elements.
* @param ComponentClass {any} The class that you want instantiated.
* @param [scope=null] {DisplayObjectContainer} This scope (parent object) is needed to instantiate the component/view with the use of the {{#crossLink "DisplayObjectContainer/addChild:method"}}{{/crossLink}} method.
* @return {Array.<any>} Returns a list of instantiated components/views so you can manage them within the Class that created them.
* @public
* @static
* @example
* ComponentFactory.create($('.js-list'), SomeClass, this);
*/
public static create ($elements:JQuery, ComponentClass:any, scope:DisplayObjectContainer = null):Array<any>
{
const list:Array<DisplayObject> = [];
let component:DisplayObject;
let $element:JQuery;
const length:number = $elements.length;
let types:any;
let componentName:string;
for (let i:number = 0; i < length; i++)
{
$element = $elements.eq(i);
types = $element.attr('data-sjs-type');
if (types === void 0)
{
// Create the component if there is not a 'data-sjs-type' attribute on the element.
component = ComponentFactory._createComponent($element, ComponentClass, scope);
list.push(component);
}
else
{
// Else if there is already a 'data-sjs-type' attribute then get the type(s).
types = types.split(',');
componentName = Util.getName(ComponentClass);
// Only create the component if the component type does not already exist.
if (types.indexOf(componentName) === -1)
{
component = ComponentFactory._createComponent($element, ComponentClass, scope);
list.push(component);
}
}
}
return list;
}
/**
* Helper method to create the component.
*
* @method _createComponent
* @private
*/
private static _createComponent($element:JQuery, ComponentClass:any, scope:DisplayObjectContainer):any {
const component = new ComponentClass($element);
// If the class object has the sjsId property then I am assuming it is an instance of the DisplayObject class.
if (scope !== null && component.hasOwnProperty('sjsId') === true)
{
scope.addChild(component);
}
return component;
}
}
export default ComponentFactory;