Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >跨站数据测试

JS错误:成功解决Uncaught TypeError: Cannot read property 'message' of undefined

 

解决错误

文件夹


1、js/TemplateCompiler.js

//创建模板编译工具TemplateCompiler
class TemplateCompiler{
	//构造函数
	//视图线索,全局vm对象
	constructor(el,vm){
		//缓存重要属性
		this.el=this.isElementNode(el)?el:document.querySelector(el);
		this.vm=vm;

		//判断视图存在
		if(this.el){
			//编译工具要做的核心的三件事
			var fragment = this.node2fragment(this.el); //1、把模板内容放入内存
			//debugger;   //断点测试
			this.compile(fragment);                //2、解析模板
			this.el.appendChild(fragment);         //3、把内存结果返回到页面中
		}
		
	}
	//*************工具方法(自定义)*********************
	isElementNode(node){
		return node.nodeType === 1; //1元素节点,2属性节点,3文本节点
	}
	isTextNode(node){
		return node.nodeType === 3; 
	}
	toArray(fakeArr){   //将假数组转为真数组,以假乱真
		return [].slice.call(fakeArr)
	}
	isDirective(attrName){   //判断传入内容是否为指令,比如判断v-text
		return attrName.indexOf('v-') >=0;  //判断属性名中是否有'v-'开头的
	}
	
	//*************核心方法*********************
	//把模板放入内存,等待解析
	node2fragment(node){
		var fragment = document.createDocumentFragment(),child;  //(1)、创建内存片段
		//debugger;   //断点测试
		while(child = node.firstChild){  //(2)、把模板内容丢到内存,循环读取
			fragment.appendChild(child);
		}
		return fragment;     //(3)、返回
		
		
	}
	compile(parent){
		var childNodes=parent.childNodes,   //(1)、获取字节点
			complier = this;  //缓存当前的对象
		//(2)、一个个解析。遍历每一个节点
		this.toArray(childNodes).forEach((node)=>{    //正常写法转为箭头写法:function(node)变为(node)=>
		
		//(3)、判断节点类型,元素节点、文本节点
		if(complier.isElementNode(node)){  //如果是元素节点,就进行解析
			complier.compileElement(node);  //解析标签的方法
		}
		
		//(4)、如果还有节点,继续解析
	  });
		
	}
	//专门解析元素节点指令的
	compileElement(node){
		var arrs = node.attributes, //(1)获取当前节点的所有属性,即获得一堆数组
		complier = this;  
		//(2)、遍历当前元素的所有属性
		this.toArray(arrs).forEach(attr=>{
			var attrname= attr.name;
			if(complier.isDirective(attrname)){  //(3)判断属性是否是指令
				//(4)、收集信息,指令类型,
				//var type = attrname.split('-')[1];  //T1、先找到v-text的'-',然后下标为1开始截取
				var type = attrname.substr(2);      //T2、或者从下标为2开始截取
				var expr = attr.value;   //表达式
				//(5)、找帮手
				debugger;
				CompilerUtils[type](node,complier.vm,expr);
				
				
			}
			
		});
	}
	//解析表达式
	compileText(){}
	
}
//榜手,普通对象,提供以一系列工具、方法为我们做事
CompilerUtils={
		//解析text指令的方法
		text(node,vm,expr){
			//(1)、找到更新规则对象的更新方法
			var updaterFn = this.updater['textUpdater'];
			//(2)、执行方法
			updaterFn && updaterFn(node,vm.$data[expr]); //先判断是否存在
			//updaterFn()
		},
		model(node,vm,expr){
			//(1)、找到更新规则对象的更新方法
			var updaterFn = this.updater['modelUpdater'];
			//(2)、执行方法
			updaterFn && updaterFn(node,vm.$data[expr]); //先判断是否存在
			//updaterFn()
			
		},
		updater:{  
			textUpdater(node,value){   //文本的更新方法
				node.textContent = value;
			},
			modelUpdater(node,value){  //文本框的更新方法
				node.value = value;
			}
		}
		//更新规则对象
}

2、js/mvvm.js文件

//创建一个MVVM框架的类,主要是打包mvvm框架做的事情。
//var a=100;
//function fn(){ }

//作用是用来解析视图模板,把对应的数据渲染到页面上
class MVVM{   //类是用来创建实例的
	//构造器,创建实例的模板代码
	constructor(options){
		//缓存重要属性,视图、数据
		this.$vm=this;  //先绑定自己
		this.$el=options.el;    
		this.$data=options.data;
		
		//判断视图是否存在
		if(this.$el){
			//创建模板编译器来解析视图
			this.$TemplateCompiler = new TemplateCompiler(this.$el,this.$data);
			
		}
		
	}
	
}

3、MyHtml.html文件

<!DOCTYPE html>
<html>
  <head>
    <title>MyHtml.html</title>
	
    <meta name="keywords" content="keyword1,keyword2,keyword3">
    <meta name="description" content="this is my page">
    <meta name="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

  </head>
  
  <body>
    
    <!--1、创建一个视图容器,两种方式。<br>是换行、input输入框-->
    <div id='app'>
    <span v-text='message' class='XXXX'> </span>  <br>
<!--     {{message}}  <br> -->
<!-- 	通过视图输入框去改变数据 -->
    <input type='text' v-model='message'>   
    <div v-text='username'> </div> 
    </div>
    
    <!--2、引入cdn框架,后改为自己的框mvvm架,然后将new Vue改为new MVVM-->
    <!--  <script src="https://cdn.bootcss.com/vue/2.5.16/vue.js"></script>    -->
    <script src="./js/templateCompiler.js"></script> 
    <script src="./js/mvvm.js"></script> 
    
    <!--3、编辑脚本,作为桥梁把数据扔到html页面上-->
    <script>
    //建立全局变量vm,在网页上右键审查元素,输入vm可获取vm参数,然后输入vm.message回车即可访问message
    var vm = new MVVM({
    //挂载视图,把显示的绑过来
    el: '#app',
    //定义数据,把数据源绑过来
    data:{
	    message:'欢迎进入机器学习和深度学习的世界!',
	    username:'元宝'
	    }
    })
    </script>
  </body>
</html>

 

解决方法

1、正在寻找答案……

 

 

 

 

除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog

上一篇: 毕业两年总结

下一篇: 首次使用idea需要配置哪些东西?

精华推荐