(function (factory) {
Eif (typeof module === 'object' && typeof module.exports === 'object') {
var v = factory(require, exports); Iif (v !== undefined) module.exports = v;
}
else if (typeof define === 'function' && define.amd) {
define(["require", "exports", '../util/Util'], factory);
}
})(function (require, exports) {
"use strict";
var Util_1 = require('../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
*/
var ComponentFactory = (function () {
function ComponentFactory() {
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);
*/
ComponentFactory.create = function ($elements, ComponentClass, scope) {
if (scope === void 0) { scope = null; }
var list = [];
var component;
var $element;
var length = $elements.length;
var types;
var componentName;
for (var i = 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_1.default.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
*/
ComponentFactory._createComponent = function ($element, ComponentClass, scope) {
var 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;
};
return ComponentFactory;
}());
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = ComponentFactory;
});
|