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

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

优化细节,标签多个效果。

如select正常得到的是value值,但是我们实际要在其他地方显示value对应的文字。


【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="app.js"></script>
		<link rel="stylesheet" href="css/layui.css" media="all">
	</head>
	<body>
		
		<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>
		
		<select ng-model="form.age">
			<option value="" >请选择</option>
			<option ng-repeat="x in option" value="{{x.value}}" ng-selected="form.age==x.value">{{x.text}}</option>
		</select>
		
		<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>异常:显示的是value</h1>
			我的年龄:{{form.age}}
			<br>
			妈妈的年龄:{{form.age2}}
			<br>
			爸爸的年龄:{{form.age3}}
			<br>
		</div>	
		<div>
			<h1>正常:显示的是text</h1>
			我的年龄:{{get_option_text(option,form.age)}}
			<br>
			妈妈的年龄:{{get_option_text(option,form.age2)}}
			<br>
			爸爸的年龄:{{get_option_text(option,form.age3)}}
			<br>
			show_text - >get_option_text
		</div>
		<script>

			function load_select()
			{
				//所有select的渲染对象
				app.$scope.render_select={
					data:{},
					open:function(id)
					{
						console.log('open');
						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;
						}
					},
					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;
						

						
					},
					show_text(option,value)
					{
						var text='';
						for(var i in option)
						{
							if(option[i].value==value)
							{
								text=option[i].text;
								break;
							}
						}
						return text;
					}
					
					
				};
				$('zs[zs-type="select"]').each(function(){
					var $this=$(this);
					var this_model=$this.attr("zs-model");
					var this_option=$this.attr("zs-option");
					var this_change=$this.attr("zs-change");
					var this_title=$this.attr("zs-title");
					var this_placeholder=$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="{{render_select.show_text(${this_option},${this_model})}}" readonly="" class="layui-input layui-unselect">
									<i class="layui-edge"></i>
								</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>
					`;
					$this.before(app.html(this_select_html));
					$this.remove();


				
					
					
				});
				app.update();
			}
			
			
			//框架的 标签功能 解析demo
			//<zs zs-type="select" zs-option="option" zs-model="form.age" zs-change="age_change" zs-title="请选择您的年龄" zs-placeholder="请选择"></zs>

			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);
				}
				
				load_select();
				app.update();//页面渲染
			});
		</script>
		
	</body>
</html>

【app.js】

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;
				}
				
				back();
			});

			this.app=app;
		}
		
		//更新模板渲染 优化ng频繁更新有报错,这里加1毫秒延迟 避免报错
		,update:function(){
			var me=this;
			setTimeout(function(){
				try{
					me.$scope.$apply();
				}catch(e){}
			},1);
		},
		//配合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;
};


image.png

标签: 外挂式编程

相关文章

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

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

有了外挂式思维基础,开始涉及框架。个人理解,所谓框架就是自己研究一些习惯、一些风格,出于某个目的(如快速开发),而设计并开发出的一套生产工具。我这里对框架的需求主要是两点1、快。为了减少开发的工作时间...

外挂式插件编程思路【基础篇】(2)

外挂式插件编程思路【基础篇】(2)

* 本网页 讲解外挂插法,外插(内部的东西插到外部使用)。* 内部的代码几乎不变的情况下, 通过插入外部的个别方法,达到控制内部的目的* 特征,主要代码是写外部逻辑。内部尽可能的不动、少动【demo....

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

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

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

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

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

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

外挂式插件编程思路【基础篇】(3)

外挂式插件编程思路【基础篇】(3)

* 本网页 讲解外挂插法,内插(外部的东西往内部插)。 * window.plugin01,window.plugin02模拟2个外部用户,内部的逻辑方法会随着外部更改而...

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

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

路由功能,单页面应用更加得心应手。【index.html】<!DOCTYPE html> <html ng-app="myApp" ...