实现文本插值与s-for循环模版。

对于文本插值的实现,我采用正则去匹配还原这个dom节点,以插值{{text}}形式为分界,将这个dom节点的文本分割成多个字符串,存储在this.muscha中,再者,将普通文本字符串以数组形式存储在string属性中,将插值存放在text属性值。当然,拼接的时候要明白先从string还是先从text开始拼接,我采用的方法是设置标志值,tag属性为0时,从text开始,为1时从string开始,存储完成后,解析拼接时只会出现这么几种情况:字串文本在前插值(1个或者多个)在后、只出现插值(1个或者多个)、前面后面插值中间为字串,前面后面为字串中间为插值。这些都可以分别处理,this.muscha函数如下:

this.muscha = function(value) {var temp = {string: [],text: [],tag: 0};var reg = /\{\{((?:.|\\n)+?)\}\}/g;if (!reg.test(value)) {return null;}var match;var lastIndex = reg.lastIndex = 0;var index;while(match = reg.exec(value)) {index = match.index;if (index > lastIndex) {temp.tag = 1;temp.string.push(value.slice(lastIndex, index));}temp.text.push(match[1]);lastIndex = index + match[0].length;}if (lastIndex < value.length) {temp.string.push(value.slice(lastIndex));}return temp;
}

拼接字串的方式如下:

this.strSplit = function(item) {var str = '';if (!item.muscha.tag) {var len = item.muscha.string.length;switch(len) {case 0:for (var i = 0; i < item.muscha.text.length; i++) {str += data[item.muscha.text[i]];}break;case 1:str = data[item.muscha.text[0]] + item.muscha.string[0];break;default:for (var i = 0; i < len; i++) {str = data[item.muscha.text[i]] + item.muscha.string[i];}str += data[item.muscha.text[i]];}} else {var len = item.muscha.text.length;switch(len) {case 1://console.log(data[item.muscha.text[0]]);str = item.muscha.string[0] + data[item.muscha.text[0]];break;default:for (var j = 0; j < len; j++) {str = item.muscha.string[j] + data[item.muscha.text[j]];}str += item.muscha.string[j];}}return str;
}

进一步,实现循环模版。带有非根元素(代码中的最外层节点)的父元素的循环节点处理起来相对容易,只需要将父元素先清理干净(parentNode.innerHTML = ''),循环数据后插入相应的dom节点即可。只是花了不少的时间在父元素为根节点的循环模版上,如果采用相同的方法,页面结构必然会被破坏,当我们重写这个节点后对节点的引用也就失效了,于是上一种的情况采用父节点来辅助,于是在这就联想到,我是否可以借助兄弟元素来实现呢?当然,各种各样的问题也在这里出现,加深了对dom节点操作的知识(唉,太渣!),倒腾了不久,终于写出了代码!(但是就是丑~)。代码如下:

case 's-for':var items = data[item.list];var fragment = document.createDocumentFragment();if (content) {for (var i = 0, len = items.length; i < len; i++) {var dom = document.createElement(item.node.nodeName.toLowerCase());dom.innerHTML = items[i][content];if (item.event) {for (var j = 0; j < item.event.length; j++) {dom.addEventListener(item.event[j].type, that.eventProcess(methods[item.event[j].event]), false);}}fragment.appendChild(dom);}if (item.parentNode) {var dom = document.createElement(item.node.nodeName.toLowerCase());item.parentNode.innerHTML = '';item.parentNode.appendChild(fragment);} else{if (item.nextElementSibling === undefined) {item.nextElementSibling = item.node.nextElementSibling;if (item.node.nextElementSibling === null) {item.node.parentNode.insertBefore(fragment, item.node);//console.log(item.node.parentNode.lastElementChild);item.node.parentNode.removeChild(item.node.parentNode.lastElementChild);} else { item.node.nextElementSibling.parentNode.insertBefore(fragment, item.node);item.node.nextElementSibling.parentNode.removeChild(item.node);}}}}break;};

好了,暂时就实现这么点,插值的供能是很强大的,这里实现的功能也只是一部分~

转载于:https://www.cnblogs.com/susantong/p/6958788.html

仿照vue实现简易的MVVM框架(二)相关推荐

  1. 仿照vue实现简易的MVVM框架(一)

    代码github地址: https://github.com/susantong/myMVVM 主要的方法有: compile 深度遍历前端界面的节点,将其复制进一个addQuene队列中 paser ...

  2. MVVM框架与VUE实现原理

    1.MVVM是Model-View-ViewModel的简写.即模型-视图-视图模型.[模型]指的是后端传递的数据.[视图]指的是所看到的页面.[视图模型]mvvm模式的核心,它是连接view和mod ...

  3. MVVM框架的搭建(二)——项目搭建

    介绍完背景以及初衷之后,我们开始搭建MVVM的框架,这一部分我们进行简单的搭建,了解MVVM架构的基本结构. MVVM框架的搭建(一)--背景 MVVM框架的搭建(二)--项目搭建 MVVM框架的搭建 ...

  4. 3 ie兼容 vue_前端开发:MVVM框架之Vue势必会取代JQuery吗?

    最近接受一个新项目,前端是选用jquery还是用vue这个问题,团队里面就产生了分歧,我作为项目负责人,最终决定新项目采用Vue,原因如下: 1.本次项目界面和后台数据交互比较多,采用mvvm框架开发 ...

  5. 好程序员web前端分享MVVM框架Vue实现原理

    好程序员web前端分享MVVM框架Vue实现原理,Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js和react.js更加简洁 ...

  6. 结合vue、react、angular谈谈MVC、MVP、MVVM框架

    首先,在谈这个话题之前, 我们有必要了解一下库和框架的区别. 我们先来看react官网以及vue官网对他们的定位: react: vue: react我们不说了,官网上明明白白说了,人家是一个libr ...

  7. vue笔记1 渐进式、 MVVM 框架

    参考 理解MVVM在react.vue中的使用 结合vue.react.angular谈谈MVC.MVP.MVVM框架 Vue(MVVM).React(MVVM).Angular(MVC)对比 vue ...

  8. Android MVVM框架搭建(二)OKHttp + Retrofit + RxJava

    Android MVVM框架搭建(二)Retrofit + RxJava 前言 正文 一.引入依赖 二.工具类 三.构建网络框架 1. Base 2. 异常处理 3. 拦截器 4. 网络请求服务 四. ...

  9. “约见”面试官系列之常见面试题之第九十四篇之MVVM框架(建议收藏)

    目录 一句话总结:vm层(视图模型层)通过接口从后台m层(model层)请求数据,vm层继而和v(view层)实现数据的双向绑定. 1.我大前端应该不应该做复杂的数据处理的工作? 2.mvc和mvvm ...

最新文章

  1. 美甲帮:玩转指甲上的大数据平台
  2. ClassPathBeanDefinitionScanner 扫描给定的包及其子包
  3. Hive更换TEZ引擎
  4. Linux 命令之 iostat 命令-监视系统输入输出设备和 cpu 的使用情况
  5. python学多久能写东西的软件有哪些_怎么自学python,大概要多久?
  6. mac用什么写python程序_mac下,有哪些python开发工具可用
  7. 判断一个图是否有环(有向图,无向图)
  8. SQL Server 常用函数总结
  9. OpenGL ES 中的模板测试
  10. 挑战性题目DSCT101:硬币找换问题
  11. 网络+系统+ITSM工具Network+system+ITSM tool
  12. python同花顺交易接口_TradeApi为A股程序化交易接口2.9.0发布
  13. spanning tree protocol
  14. [每日一题] 11gOCP 1z0-052 :2013-09-28 ORA-01555: snapshot too old......................C52
  15. 【网络取证篇】suy网络工具包
  16. 人工智能入门参考资料
  17. 【Vue2注册登录界面】Vue2+elementUI编写一个登录页面,路由式开发,后台管理系统登录界面
  18. 自己动手写CPU(11)——加载存储指令说明
  19. libusb系列-007-Qt下使用libusb1.0.26源码
  20. javaWeb的分页

热门文章

  1. 009Maven_建立私服——报错问题
  2. Qt Model/View/Delegate浅谈 - QAbstractListModel
  3. 通过iOS 9 SFSafariViewController提供完整的Web浏览体验
  4. 码农提高工作效率(转载)
  5. hp eva 4400存储配置手记
  6. 不能因技术后天的死 而迷茫了今天的“学” 生
  7. shell批量文件编码转换
  8. 记一次Mysql查询字段为空串在java中使用equals不相等的问题
  9. L1-048 矩阵A乘以B-PAT团体程序设计天梯赛GPLT
  10. PAT 乙级 1029. 旧键盘(20) Java版