mcs-ng-material
Version:
MCS NG-Meterial is based on mcs-web.
165 lines (149 loc) • 3.68 kB
JavaScript
define(['app'],function(app){
//op: name, path, id
var me=function ELEMENT(cfg, op){
this.app=app;
this.config=cfg||{};
this.op=op||{}
this.cmpName=this.toDirectiveName(this.op.id);
this.items=[];
this.links=[];
this.prepare();
if (this.asComponent!==false){
this.defineComponent();
if (op.lazyLoad) this.genStates();
}
}
app.reg("ELEMENT",me);
var C=me.prototype;
C.defineComponent=function(){
var cmp={
template: this.template()
}
var ctrl=this.controller();
if (ctrl) cmp.controller=ctrl;
if (this.controllerAs) cmp.controllerAs=this.controllerAs; else cmp.controllerAs="ctrl"
var resolve=this.resolve();
if (resolve) cmp.resolve=resolve;
if (this.bindings) cmp.bindings=this.bindings;
app.component(this.op.id,cmp);
console.info('defined name=%o comp=%o cfg=%o',this.cmpName,cmp,this.config);
}
C.prepare=function(){
}
C.genItems=function(items,opt){//opt={tag,defCls,...}
var mm=[],id=this.op.id,tag=tag||'',opt=opt||{};
if (items)
for (var i=0;i<items.length;i++){
var it=items[i];
var type=it.$type||opt.defCls;
var cls=app.modules[type];
var op={id:id+opt.tag+i};
Object.assign(op,opt);
var m=new cls(it,op);
mm.push(m)
this.items.push(m);
}
return mm;
}
C.genTemplateList=function(items, opt){
if (!items) return ''
var mm=this.genItems(items, opt);
var temp='';
for (var i=0;i<mm.length;i++){
var m=mm[i];
temp+=m.template();
}
return temp;
}
C.filterItems=function(op){
var ss=[],args=arguments;
for (var k=1;k<args.length;k++){
var items=args[k];
if (!items) continue;
for (var i=0;i<items.length;i++){
var it=items[i];
if (op.attr){
if (op.val){
if (it[op.attr]==op.val) ss.push(it);
}
else
if (op.isNull){
if (!it[op.attr]) ss.push(it);
}
else
if (op.isNotNull){
if (it[op.attr]) ss.push(it);
}
}
}
}
return ss;
}
C.template=function(){
return '<p></p>';
}
C.controller=function(){
var fn=function($scope){
var me=this.constructor.me;
$scope.log=console.log;
console.info('CTRL init for '+me.op.id);
$scope.openMenu = function($mdMenu, ev) {
console.info('OOOPPPEEENNN ev=%o',ev);
$mdMenu.open(ev);
}
}
fn.me=this;
return fn;
}
C.resolve=function(){
return false;
}
C.toDirectiveName=function(st){
var tar="";
for (var i=0;i<st.length;i++){
var ch=st[i];
if (ch=='/') ch='-';
if (ch>='A' && ch<='Z' && tar.length>0) tar+='-';
tar+=ch.toLowerCase();
}
return tar;
}
C.genStates=function(){
var name=this.op.id,path=this.op.path,root=this.op.root;
name=name.replace('/','_');
if (!path.endsWith("/")) path+="/";
var states=[];
//root state
var state={
name:root+'.'+name,
path:path+name,
template:`<${this.cmpName}></${this.cmpName}>`
}
states.push(state);
var target=root+'.'+name;
var links=this.links;
if (links.length>0){
for (var i=0;i<links.length;i++){
var it=links[i],module=it.module,furture=module.replace('/','_');
var linkOp={
name:root+"."+name+"."+future,
path:path+"/"+name+"/"+future,
id: it.module
}
var linkState={
name:linkOp.name,
path:linkOp.path,
template:'<div ui-view/>',
resolve:{
lazyLoad: app.getLazyLoad(it.module,linkOp),
},
controller: app.getLazyCtrl()
}
states.push(linkState);
}
}
this.target=target;
this.states=states;
}
return me;
})