(function () { var moduleInjection = {}, moduleInjectionMap = { components: {}, constants: {}, stores: {}, services: {}, models: {}, providers: {} }; BI.module = BI.module || function (xtype, cls) { if (moduleInjection[xtype] != null) { _global.console && console.error("module: [" + xtype + "] 已经注册过了"); } if (BI.isFunction(cls)) { cls = cls(); } for (var k in moduleInjectionMap) { if (cls[k]) { for (var key in cls[k]) { if (!moduleInjectionMap[k]) { continue; } if (!moduleInjectionMap[k][key]) { moduleInjectionMap[k][key] = []; } moduleInjectionMap[k][key].push({ version: cls[k][key], moduleId: xtype }); } } } moduleInjection[xtype] = cls; }; var constantInjection = {}; BI.constant = BI.constant || function (xtype, cls) { if (constantInjection[xtype] != null) { _global.console && console.error("constant: [" + xtype + "]已经注册过了"); } constantInjection[xtype] = cls; }; var modelInjection = {}; BI.model = BI.model || function (xtype, cls) { if (modelInjection[xtype] != null) { _global.console && console.error("model: [" + xtype + "] 已经注册过了"); } modelInjection[xtype] = cls; }; var storeInjection = {}; BI.store = BI.store || function (xtype, cls) { if (storeInjection[xtype] != null) { _global.console && console.error("store: [" + xtype + "] 已经注册过了"); } storeInjection[xtype] = cls; }; var serviceInjection = {}; BI.service = BI.service || function (xtype, cls) { if (serviceInjection[xtype] != null) { _global.console && console.error("service: [" + xtype + "] 已经注册过了"); } serviceInjection[xtype] = cls; }; var providerInjection = {}; BI.provider = BI.provider || function (xtype, cls) { if (providerInjection[xtype] != null) { _global.console && console.error("provider: [" + xtype + "] 已经注册过了"); } providerInjection[xtype] = cls; }; var configFunctions = {}; var runConfigFunction = BI.runConfigFunction = function (type) { if (!type || !configFunctions[type]) { return false; } var queue = configFunctions[type]; delete configFunctions[type]; var dependencies = BI.Providers.getProvider("bi.provider.system").getDependencies(); var modules = moduleInjectionMap.components[type] || moduleInjectionMap.constants[type] || moduleInjectionMap.services[type] || moduleInjectionMap.stores[type] || moduleInjectionMap.models[type] || moduleInjectionMap.providers[type]; for (var i = 0; i < queue.length; i++) { var conf = queue[i]; var version = conf.opt.version; var fn = conf.fn; if (modules && version) { var findVersion = false; for (var j = 0; j < modules.length; j++) { var module = modules[j]; if (module && dependencies[module.moduleId] && module.version === version) { var minVersion = dependencies[module.moduleId].minVersion, maxVersion = dependencies[module.moduleId].maxVersion; if (minVersion && (moduleInjection[module.moduleId].version || version) < minVersion) { findVersion = true; break; } if (maxVersion && (moduleInjection[module.moduleId].version || version) > maxVersion) { findVersion = true; break; } } } if (findVersion === true) { _global.console && console.error("moduleId: [" + module.moduleId + "] 接口: [" + type + "] 接口版本: [" + version + "] 已过期,版本要求为:", dependencies[module.moduleId], "=>", moduleInjection[module.moduleId]); continue; } } if (constantInjection[type]) { constantInjection[type] = fn(constantInjection[type]); continue; } if (providerInjection[type]) { if (!providers[type]) { providers[type] = new providerInjection[type](); } if (providerInstance[type]) { delete providerInstance[type]; } fn(providers[type]); continue; } BI.Plugin.configWidget(type, fn, conf.opt); } }; BI.config = BI.config || function (type, configFn, opt) { opt = opt || {}; // 系统配置直接执行 if ("bi.provider.system" === type) { if (!providers[type]) { providers[type] = new providerInjection[type](); } // 如果config被重新配置的话,需要删除掉之前的实例 if (providerInstance[type]) { delete providerInstance[type]; } return configFn(providers[type]); } if (!configFunctions[type]) { configFunctions[type] = []; } configFunctions[type].push({ fn: configFn, opt: opt }); // // 初始化过或者系统配置需要立刻执行 // if (BI.initialized || "bi.provider.system" === type) { // if (constantInjection[type]) { // return (constantInjection[type] = configFn(constantInjection[type])); // } // if (providerInjection[type]) { // if (!providers[type]) { // providers[type] = new providerInjection[type](); // } // // 如果config被重新配置的话,需要删除掉之前的实例 // if (providerInstance[type]) { // delete providerInstance[type]; // } // return configFn(providers[type]); // } // return BI.Plugin.configWidget(type, configFn, opt); // } // if (!configFunctions[type]) { // configFunctions[type] = []; // BI.prepares.push(function () { // var queue = configFunctions[type]; // var dependencies = BI.Providers.getProvider("bi.provider.system").getDependencies(); // var modules = moduleInjectionMap.components[type] // || moduleInjectionMap.constants[type] // || moduleInjectionMap.services[type] // || moduleInjectionMap.stores[type] // || moduleInjectionMap.models[type] // || moduleInjectionMap.providers[type]; // for (var i = 0; i < queue.length; i++) { // var conf = queue[i]; // var version = conf.opt.version; // var fn = conf.fn; // if (modules && version) { // var findVersion = false; // for (var j = 0; j < modules.length; j++) { // var module = modules[i]; // if (module && dependencies[module.moduleId] && module.version === version) { // var minVersion = dependencies[module.moduleId].minVersion, // maxVersion = dependencies[module.moduleId].maxVersion; // if (minVersion && (moduleInjection[module.moduleId].version || version) < minVersion) { // findVersion = true; // break; // } // if (maxVersion && (moduleInjection[module.moduleId].version || version) > maxVersion) { // findVersion = true; // break; // } // } // } // if (findVersion === true) { // _global.console && console.error("moduleId: [" + module.moduleId + "] 接口: [" + type + "] 接口版本: [" + version + "] 已过期,版本要求为:", dependencies[module.moduleId], "=>", moduleInjection[module.moduleId]); // continue; // } // } // if (constantInjection[type]) { // constantInjection[type] = fn(constantInjection[type]); // continue; // } // if (providerInjection[type]) { // if (!providers[type]) { // providers[type] = new providerInjection[type](); // } // if (providerInstance[type]) { // delete providerInstance[type]; // } // fn(providers[type]); // continue; // } // BI.Plugin.configWidget(type, fn); // } // configFunctions[type] = null; // }); // } // configFunctions[type].push({ // fn: configFn, // opt: opt // }); }; BI.getReference = BI.getReference || function (type, fn) { return BI.Plugin.registerObject(type, fn); }; var actions = {}; var globalAction = []; BI.action = BI.action || function (type, actionFn) { if (BI.isFunction(type)) { globalAction.push(type); return function () { BI.remove(globalAction, function (idx) { return globalAction.indexOf(actionFn) === idx; }); }; } if (!actions[type]) { actions[type] = []; } actions[type].push(actionFn); return function () { BI.remove(actions[type], function (idx) { return actions[type].indexOf(actionFn) === idx; }); if (actions[type].length === 0) { delete actions[type]; } }; }; var points = {}; BI.point = BI.point || function (type, action, pointFn, after) { if (!points[type]) { points[type] = {}; } if (!points[type][action]) { points[type][action] = {}; } if (!points[type][action][after ? "after" : "before"]) { points[type][action][after ? "after" : "before"] = []; } points[type][action][after ? "after" : "before"].push(pointFn); }; BI.Modules = BI.Modules || { getModule: function (type) { if (!moduleInjection[type]) { _global.console && console.error("module: [" + type + "] 未定义"); } return moduleInjection[type]; }, getAllModules: function () { return moduleInjection; } }; BI.Constants = BI.Constants || { getConstant: function (type) { if (BI.isNull(constantInjection[type])) { _global.console && console.error("constant: [" + type + "] 未定义"); } runConfigFunction(type); return constantInjection[type]; } }; var callPoint = function (inst, types) { types = BI.isArray(types) ? types : [types]; BI.each(types, function (idx, type) { if (points[type]) { for (var action in points[type]) { var bfns = points[type][action].before; if (bfns) { BI.aspect.before(inst, action, function (bfns) { return function () { for (var i = 0, len = bfns.length; i < len; i++) { try { bfns[i].apply(inst, arguments); } catch (e) { _global.console && console.error(e); } } }; }(bfns)); } var afns = points[type][action].after; if (afns) { BI.aspect.after(inst, action, function (afns) { return function () { for (var i = 0, len = afns.length; i < len; i++) { try { afns[i].apply(inst, arguments); } catch (e) { _global.console && console.error(e); } } }; }(afns)); } } } }); }; BI.Models = BI.Models || { getModel: function (type, config) { if (!modelInjection[type]) { _global.console && console.error("model: [" + type + "] 未定义"); } runConfigFunction(type); var inst = new modelInjection[type](config); inst._constructor && inst._constructor(config); inst.mixins && callPoint(inst, inst.mixins); callPoint(inst, type); return inst; } }; var stores = {}; BI.Stores = BI.Stores || { getStore: function (type, config) { if (!storeInjection[type]) { _global.console && console.error("store: [" + type + "] 未定义"); } if (stores[type]) { return stores[type]; } var inst = stores[type] = new storeInjection[type](config); inst._constructor && inst._constructor(config, function () { delete stores[type]; }); callPoint(inst, type); return inst; } }; var services = {}; BI.Services = BI.Services || { getService: function (type, config) { if (!serviceInjection[type]) { _global.console && console.error("service: [" + type + "] 未定义"); } if (services[type]) { return services[type]; } services[type] = new serviceInjection[type](config); callPoint(services[type], type); return services[type]; } }; var providers = {}, providerInstance = {}; BI.Providers = BI.Providers || { getProvider: function (type, config) { if (!providerInjection[type]) { _global.console && console.error("provider: [" + type + "] 未定义"); } runConfigFunction(type); if (!providers[type]) { providers[type] = new providerInjection[type](); } if (!providerInstance[type] && providers[type].$get) { providerInstance[type] = new (providers[type].$get())(config); } return providerInstance[type]; } }; BI.Actions = BI.Actions || { runAction: function (type, event, config) { BI.each(actions[type], function (i, act) { try { act(event, config); } catch (e) { _global.console && console.error(e); } }); }, runGlobalAction: function () { var args = [].slice.call(arguments); BI.each(globalAction, function (i, act) { try { act.apply(null, args); } catch (e) { _global.console && console.error(e); } }); } }; BI.getResource = BI.getResource || function (type, config) { if (BI.isNotNull(constantInjection[type])) { return BI.Constants.getConstant(type); } if (modelInjection[type]) { return BI.Models.getModel(type, config); } if (storeInjection[type]) { return BI.Stores.getStore(type, config); } if (serviceInjection[type]) { return BI.Services.getService(type, config); } if (providerInjection[type]) { return BI.Providers.getProvider(type, config); } throw new Error("未知类型: [" + type + "] 未定义"); }; })();