外挂式插件编程思路【敏捷框架篇】(13)

野生程序猿-杂烧3年前案例分享774

zhaoshao.alert支持zs-select,结合才是一个相对复杂的应用场景。

【index.html】

<!DOCTYPE html>
<html ng-app="myApp"  ng-controller="myhtml">
	<head>
		<meta charset="utf-8" />
		<title>外挂式插件编程思路(敏捷框架篇)</title>
		<script src="jquery.min.js"></script>
		<script src="angular.min.js"></script>
		<script src="ZaShao.js"></script>
		<script src="app.js"></script>
		
		<link rel="stylesheet" href="css/layui.css" media="all">
		<link rel="stylesheet" href="css/layer/default/layer.css" media="all">
		<style>
			
			.layui-click-shade {position:fixed; background: rgba(0,0,0,0.02); top:0;left:0; width:100%; height:100%;  z-index: 808; display: none;}
			.layui-form-selected .layui-click-shade {display: block;}
			
						
		
		</style>
	</head>
	<body>
		<div style="padding: 15px;">  
			<form class="layui-form">
				<!-- 框架需要有自定义的语法 -->
				<zs zs-type="select" zs-option="option" zs-model="form.age" zs-change="age_change" zs-title="选择年龄" zs-placeholder="请选择"></zs>
				
			</form>
			
			
			<form class="layui-form">
				<!-- 框架需要有自定义的语法 -->
				<zs zs-type="select" zs-option="option" zs-model="form.age2" zs-change="" zs-title="妈妈的年龄" zs-placeholder="请选择"></zs>
				<zs zs-type="select" zs-option="option" zs-model="form.age3" zs-change="" zs-title="爸爸的年龄" zs-placeholder="请选择"></zs>
			</form>

			<div>
				<h1>正常:显示的是text</h1>
				我的年龄:<span ng-bind="get_option_text(option,form.age)"></span>
				<br>
				妈妈的年龄:<span ng-bind="get_option_text(option,form.age2)"></span>
				<br>
				爸爸的年龄:<span ng-bind="get_option_text(option,form.age3)"></span>
				
			</div>
			
			<button class="layui-btn layui-btn-normal" onclick="test_alert()">test_alert</button>
		</div>
		<script>



			var app=ng_app();
			app.init(function()
			{
				//tab标签相关
				app.$scope.form={
					age:''
				};
				app.$scope.option=[
					{value:'1',text:'10岁及以下'},
					{value:'2',text:'11-15岁'},
					{value:'3',text:'1-20岁'},
					{value:'4',text:'21-30岁以下'},
					{value:'5',text:'31岁及以上'},
					
				];
				app.$scope.age_change=function(option)
				{
					console.error('选择了年龄');
					console.log(option);
				}
				
				
				
				
				
				app.update();//页面渲染
			});
			
			function test_alert()
			{
				zashao.alert({
					title:'警告',
					content:'<zs zs-type="select" zs-option="option" zs-model="form.age" zs-change="age_change" zs-title="选择年龄" zs-placeholder="请选择"></zs>',
					btn:'确认'
				});
			}
		</script>
		
	</body>
</html>

【app.js】

var zashao;

function ng_app()
{
	var MyApp=
	{
		app:null,
		init:function(back)
		{
			console.log('init');
			var me=this;
			var app = angular.module('myApp',[]);
			app.controller("myhtml",function($scope, $http,$window,$compile)
			{
				
				me.$scope=$scope;
				me.$http=$http;
				me.$window=$window;
				me.$compile=$compile;
				$scope.get_option_text=function(option,value)
				{
					var text='';
					for(var i in option)
					{
						if(option[i].value==value)
						{
							text=option[i].text;
							break;
						}
					}
					return text;
				}
				
				zashao=new ZaShao({jquery:$,app:me});
				
				back();
			});

			this.app=app;
		}
		
		//更新模板渲染 优化避免报错,同时又要支持到同步
		,update:function(){
			var me=this;
				try{
					if(!me.$scope.$$phase) me.$scope.$apply();
					//me.$scope.$applyAsync(); 
				}catch(e){}
		},
		//配合jq使用,jq后的模板,重新渲染
		html:function(html)
		{
			var that=this;
			try{
				var result=that.$compile(html)(that.$scope);
				if(result.selector)//假设存在 this_tpl_new.selector 则认为ng变量不存在失败了
				{
					//console.error(this_tpl_new.selector);
					var result=html;
				}
			}catch(e){
				var result=html;
			}
			return result;
			
		},
		new:function(){
			return this;
		}
		
	}
	var result=MyApp.new();
	return result;
};

【ZaShao.js】

/**
 *  框架化
 * */

function ZaShao(option)
{
	var $=option.jquery;
	var app=option.app;
	var $this=null;//新增this 解决this传递问题

	var zashao=
	{
		load_select:function()
		{
			//所有select的渲染对象
			app.$scope.render_select={
				data:{},
				open:function(id)
				{
					console.log('open',id);
					if(!app.$scope.render_select.data[id].open)
					{
						app.$scope.render_select.data[id].open=true;
					}else{
						app.$scope.render_select.data[id].open=false;
					}
				},
				close:function(id)
				{
					app.$scope.render_select.data[id].open=false;
				},
				select:function(id,obj)
				{
					console.log('select',id);
					console.log(obj);
					let this_model=app.$scope.render_select.data[id].model;
					let this_change=app.$scope.render_select.data[id].change;
					
					if(this_change)
					{
						let eval_change=`
						if(obj.value != app.$scope.${this_model})
						{
							if(app.$scope.${this_change}) app.$scope.${this_change}(obj.value);
						}
						`;
						console.log(eval_change);
						eval(eval_change);
					}
					let eval_model=`app.$scope.${this_model}=obj.value;`;
					eval(eval_model);
					console.log(eval_model);
					app.$scope.render_select.data[id].open=false;
				}
			};
			$this.render.select();
			app.update();
		},
		render:{
			select:function()
			{
				$('zs[zs-type="select"]').each(function(){
					var $jq_this=$(this);
					console.log($jq_this);
					var this_model=$jq_this.attr("zs-model");
					var this_option=$jq_this.attr("zs-option");
					var this_change=$jq_this.attr("zs-change");
					var this_title=$jq_this.attr("zs-title");
					var this_placeholder=$jq_this.attr("zs-placeholder");
					var this_id=(new Date()).valueOf()+'_'+Math.random();
					//当前select的渲染对象
					app.$scope.render_select.data[this_id]={
						open:false,
						model:this_model,
						change:this_change
					};
					
						
					var this_select_html=`
						<div class="layui-form-item" id="${this_id}">
							<label class="layui-form-label">${this_title}</label>
							<div class="layui-input-block">
							  <div class="layui-unselect layui-form-select {{render_select.data['${this_id}'].open==true ? 'layui-form-selected' : ''}}">
								<div class="layui-select-title" ng-click="render_select.open('${this_id}')">
									<input type="text" placeholder="${this_placeholder}" ng-attr-value="{{get_option_text(${this_option},${this_model})}}" readonly="" class="layui-input layui-unselect">
									<i class="layui-edge"></i>
								</div>
								<div class="layui-click-shade" ng-click="render_select.close('${this_id}')"></div>
								<dl class="layui-anim layui-anim-upbit" style="">
									<dd lay-value="" class="layui-select-tips">${this_placeholder}</dd>
									<dd lay-value="{{select_option.text.value}}" class="{{${this_model}==select_option.value ? 'layui-this' : ''}}" ng-repeat="select_option in ${this_option}" ng-click="render_select.select('${this_id}',select_option)">{{select_option.text}}</dd>
						
								</dl>
							  </div>
							</div>
						</div>
					`;
					$jq_this.before(app.html(this_select_html));
					$jq_this.remove();

				});
				app.update();
			}
		},
		
		//新增弹窗方法
		alert:function(option)
		{
			if(!app.$scope.render_alert) app.$scope.render_alert={
				data:{},
				close:function(id)
				{
					app.$scope.render_alert.data[id].open=false;
				},
			};
			
			if(!option) var option={};
			if(!option.title) option.title='提示';
			if(!option.content) option.content='提示内容';
			if(!option.btn) option.btn='确定';
			if(!option.close) option.close=function(){};
			var this_id=(new Date()).valueOf()+'_'+Math.random();
			
			app.$scope.render_alert.data[this_id]={
				open:true,
				option:option,
				close:function()
				{
					app.$scope.render_alert.data[this_id].open=false;
					option.close();
				}
			}
			
			
			
			var alert_html=`
				<div id="shade_${this_id}" class="layui-layer-shade" style="z-index: 19991021; background-color: rgb(0, 0, 0); opacity: 0.3;" ng-if="render_alert.data['${this_id}'].open==true"></div>
				<div id="alert_${this_id}" class="layui-layer layui-layer-dialog"  type="dialog" howtime="0" contype="string" style="z-index: 19991022; position: fixed; top: calc(50vh - 81px); left:calc(50vw - 150px);"  ng-if="render_alert.data['${this_id}'].open==true">
					<div class="layui-layer-title" style="cursor: move;">${option.title}</div>
					<div id="" class="layui-layer-content">${option.content}</div>
					<span class="layui-layer-setwin"><a class="layui-layer-ico layui-layer-close layui-layer-close1"  ng-click="render_alert.data['${this_id}'].close()"></a></span>
					<div class="layui-layer-btn layui-layer-btn-">
						<a class="layui-layer-btn0" ng-click="render_alert.data['${this_id}'].close()">${option.btn}</a>
					</div>
					<span class="layui-layer-resize"></span>
				</div>
			`;
			setTimeout(()=>{
				$("body").before(app.html(alert_html));
				app.update();//页面必须渲染后,才能支持到render.select
				$this.render.select();
				app.update();
			},10);
			

		},
		
		
		new:function(option){
			console.log('new');
			console.log(option);
			$this=this;
			
			this.option=option;
			this.load_select();
			
			
			return this;
		}
		
	}
	var result=zashao.new(option);
	return result;
};

优化了,css部分由于直接用的layui还有些问题,双向绑定已经实现。

image.png

标签: 外挂式编程

相关文章

外挂式插件编程思路【进阶篇】(4)

外挂式插件编程思路【进阶篇】(4)

外挂式编程结合angular.js【demo.html】<!DOCTYPE html> <html ng-app="myApp" ...

外挂式插件编程思路【敏捷框架篇】(10)

外挂式插件编程思路【敏捷框架篇】(10)

优化细节,标签多个效果。如select正常得到的是value值,但是我们实际要在其他地方显示value对应的文字。【index.html】<!DOCTYPE html> <...

外挂式插件编程思路【进阶篇】(6)

外挂式插件编程思路【进阶篇】(6)

深入模拟低代码编程【index.html】<!DOCTYPE html> <html ng-app="myApp"  n...

外挂式插件编程思路【进阶篇】(7)

外挂式插件编程思路【进阶篇】(7)

拓展angular.js更多功能,如变色方案(这里简单模拟颜色变化,方案变色要改class比较合理)【inedx.html】<!DOCTYPE html> <html&n...

外挂式插件编程思路【进阶篇】(5)

外挂式插件编程思路【进阶篇】(5)

继续深造angular.js,并加入jquery.js<!-- 空html,等待html插入 --> <div id="tab_body&q...

外挂式插件编程思路【敏捷框架篇】(11)

外挂式插件编程思路【敏捷框架篇】(11)

修复bug,mvvm框架主要是善于数据,虚拟dom,与实际的dom比,监听能力差很多。这里有个bug,select下拉选项点开后,需要点其他地方关闭。如果jq,其他的点击事件很好监听。这里不用jq,用...