marko-widgets
Version:
Module to support binding of behavior to rendered UI components rendered on the server or client
96 lines (78 loc) • 2.59 kB
JavaScript
/*
* Copyright 2011 eBay Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var registered = {};
var loaded = {};
var widgetTypes = {};
var defineWidget;
var defineRenderer;
exports.register = function(typeName, type) {
if (arguments.length === 1) {
var widgetType = arguments[0];
typeName = widgetType.name;
type = widgetType.def();
}
registered[typeName] = type;
delete loaded[typeName];
delete widgetTypes[typeName];
};
function load(typeName) {
var target = loaded[typeName];
if (target === undefined) {
target = registered[typeName];
if (!target) {
target = require(typeName); // Assume the typeName has been fully resolved already
}
loaded[typeName] = target || null;
}
if (target == null) {
throw new Error('Unable to load: ' + typeName);
}
return target;
}
function getWidgetClass(typeName) {
var WidgetClass = widgetTypes[typeName];
if (WidgetClass) {
return WidgetClass;
}
WidgetClass = load(typeName);
var renderer;
if (WidgetClass.Widget) {
WidgetClass = WidgetClass.Widget;
}
if (WidgetClass.renderer) {
renderer = defineRenderer(WidgetClass);
}
WidgetClass = defineWidget(WidgetClass, renderer);
// Make the widget "type" accessible on each widget instance
WidgetClass.prototype.__type = typeName;
widgetTypes[typeName] = WidgetClass;
return WidgetClass;
}
exports.load = load;
exports.createWidget = function(typeName, id, document) {
var WidgetClass = getWidgetClass(typeName);
var widget;
if (typeof WidgetClass === 'function') {
// The widget is a constructor function that we can invoke to create a new instance of the widget
widget = new WidgetClass(id, document);
} else if (WidgetClass.initWidget) {
widget = WidgetClass;
widget.__document = document;
}
return widget;
};
defineWidget = require('./defineWidget');
defineRenderer = require('./defineRenderer');