资讯专栏INFORMATION COLUMN

对MVVM架构的一些理解

Muninn / 3073人阅读

MVVM(Model-View-ViewModel)是在MVC(Model-View-Control)模式之后引出的新的开发模式,他与MVC
模式一样用于把视图(界面)和数据进行解耦,不同的是采用ViewModel来完成数据与视图的双向绑定,通
过自动化的方式承担大部分数据工作,来解决由于界面复杂化和快速迭代带来的问题。

由于现在vue比较火,现在就用vue相同的原理(属性劫持)来完成一个简单MVVM框架

创建dom

var html="{{msg}}

{{msg2}}

{{msg}}

"; var div = document.createElement("div"); div.id="app"; div.innerHTML = html; document.body.appendChild(div);

数据对象(Model),与dom绑定的数据都在这儿

var Model = {
    msg:"hello world",
    msg2:"hello world2"
};

视图对象(View),里面封装了对dom节点的解析、事件绑定、视图更新渲染等方法

var View = {
    init:function(el){
        //将数据与View绑定
        ViewModel.bind(Model);
        //解析Dom
        this.processNode(el);
    },
    subs:[],
    processNode:function(el){
        var node = document.querySelector(el);
        var frag = document.createDocumentFragment(),child;
        while(child = node.firstChild){
            this.compile(child);
            frag.appendChild(child);
        }
        node.appendChild(frag);
    },
    compile:function(node){
        function Sub(node,name,nodeType){
            this.node = node;
            this.name = name;
            this.nodeType = nodeType;
        }
        var self = this;
        if(node.nodeType === 1){
            if(node.childNodes){
                var nodes =[...node.childNodes];
                nodes.forEach(function(node){
                    self.compile(node);
                })
            }
            var attrs = [...node.attributes];
            attrs.forEach(function(attr){
                if(attr.nodeName === "v-model"){
                    var name = attr.nodeValue;
                    node.addEventListener("input",function(e){
                        self[name] = e.target.value;
                    });
                    node.value = self[name];
                    node.removeAttribute("v-model");
                    var sub = new Sub(node,name,"input");
                    self.render(sub);
                    self.subs.push(sub);
                }
            })
        }
        if(node.nodeType === 3){
            if(/{{(.*)}}/.test(node.nodeValue)){
                var name = RegExp.$1;
                name=name.trim();
                var sub = new Sub(node,name,"text");
                self.render(sub);
                self.subs.push(sub);
            }
        }
    },
    update:function(){
        var self = this;
        this.subs.forEach(function(sub){
            self.render(sub);
        })
    },
    render:function(sub){
        if(sub.nodeType === "input"){
            sub.node.value=this[sub.name];
        }
        if(sub.nodeType === "text"){
            sub.node.nodeValue=this[sub.name];
        }
    }
};

视图模板绑定对象(ViewModel),这也是mvvm实现的核心方法,通过defineProperty将Model对象中的数据
复制到了View对象中,并对数据进行了监控,每当get或set时都会触发自定义事件,完成对视图的跟新。

var ViewModel={
    bind:function(m){
        Object.keys(m).forEach(function(key){
            Object.defineProperty(View,key,{
                get:function(){
                    return m[key];
                },
                set:function(newVal){
                    m[key] = newVal;
                    this.update();
                }
            })
        });
    }
};

最后调用View对象的初始化方法执行框架,至此就完成了一个简单的MVVM框架。

View.init("#app");

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/94727.html

相关文章

  • 浅析 web 前端 MVVM

    摘要:它由微软架构师和开发,通过利用微软图形系统和的互联网应用派生品的特性来简化用户界面的事件驱动程序设计。微软的和架构师之一于年在他的博客上发表了。更改时会得到提醒这个情况是一个单向流。 前言 记得四个月前有一次面试,面试官问我 MVVM 是什么,MVVM 的本质是什么。我大脑一片混乱,那时我对 MVVM 的认知就只是双向绑定和Vue,以这个关键字简单回答了几句,我反问 MVVM 的本质是...

    VincentFF 评论0 收藏0
  • Android架构

    摘要:目前它还未正式发布。理解系列一是谷歌在发布一套帮助开发者解决架构设计的方案。但最近还是推出了一份关于应用架构的实践指南,并给出了相当详尽的步骤和一些指导建议。 MVP+Retrofit+Rxjava在项目中实战解析 文章目标 MVP在android中的原理解析 MVP+Retrofit+Rxjava在项目中实战解析 架构经验分享 MVP简单介绍 先说说MVC分层: View:对应于布局...

    bergwhite 评论0 收藏0
  • 前端框架模式变迁

    摘要:现在在前端的框架都是的模式,还有像和之类的变种独特的单向数据流框架。只要将数据流进行规范,那么原来的模式还是大有可为的。我们可以来看一下,框架的图示从图中,我们可以看到形成了一条到,再到,之后是的,一条单向数据流。 前言 前端框架的变迁,体系架构的完善,使得我们只知道框架,却不明白它背后的道理。我们应该抱着一颗好奇心,在探索框架模式的变迁过程中,体会前人的一些理解和思考 本篇将讲述的是...

    ssshooter 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<