林秀栋的技术博客

设计模式(三十七) MVVM模式

MVVM模式:模型(model)-视图(view)-视图模型(ViewModel)

为v量身定做一套vm,并在vm创建属性和方法,为v绑定m并实现交互

//~屏蔽压缩报错
~(function(){
	var window = this || (0, eval)('this');	//在闭包中获取全局变量
	//视图模型对象
	var VM = function(){
		//组件创建策略对象
		var Method = {
			//创建a组件的html并append,及创建对应的事件等
			a: function(){},
			//b组件相关,同上
			b: function(){}
		}
		//获取视图层组件渲染数据的映射信息
		function getBindData(dom){
			//获取组件自定义的data-bind值并转为对象
			//比如<input data-bind=" type:a1, msg:'hello' ">
			var data = dom.getAttribute('data-bind');
			return !!data && (new Function("return ({"+data+"})"))();
		}
		//组件实例化
		return function(){
			//获取页面全部元素
			var doms = document.body.getElementsByTagName('*'),
				ctx = null;	//元素自定义数据句柄
			//ui处理是会向页面插入元素,此时doms.length会改变,此时动态获取dom.length
			for(var i = 0; i < doms.length; i++){
				//获取元素自定义数据
				ctx = getBindData(doms[i]);
				//如果元素是ui组件,则根据自定义属性中的组件类型,渲染该组件
				ctx.type && Method[ctx.type] && Method[ctx.type](doms[i],ctx);
			}
		}
	}();
	//将视图模型对象绑定在window上,供外部使用
	window.VM = VM;
})();

//使用
var demo = {};	//数据
window.onload = function(){
	VM();
}

从三十二开始到三十七的设计模式属于架构型设计模式