设计模式知识连载(48)---MVC模式:

<body>


<h3>设计模式知识连载(48)---MVC模式:</h3>
<div>
    <p>
         模型(model)-视图(view)-控制器(controller),用一种将业务逻辑、数据、视图分离的方式组织架构代码
    </p>

</div>


<hr>


<script type="text/javascript">



    /**
    *   案例一:,方式一:初始
    */
    /* 为简化页面操作逻辑,这里引用链模式中实现的A框架,具体方法参考附录A */
    // 页面加载后创建MVC对象
    $(function() {
        // 初始化MVC对象
        var MVC = MVC || {} ;
        // 初始化MVC数据模型层
        MVC.model = (function() {
            // 内部数据对象
            var M = {} ;
            // 服务器端获取的数据,通常通过ajax获取并存储,后面的案例为简化实现,直接作为同步数据
            // 写在页面中,减少服务器端异步请求操作
            M.data = {
                /* 模拟数据 */
                // 左侧侧边栏导航服务器端请求得到的响应数据
                slideBar : [
                    {
                        text : '萌萌哒',
                        icon : 'left_meng.png',
                        title : '猫耳朵萝莉千本樱',
                        content : '萝莉有三好',
                        img : 'left_meng_img.png',
                        href : 'https://www.baidu.com'
                    },
                    {
                        text : '萌萌哒',
                        icon : 'left_meng.png',
                        title : '猫耳朵萝莉千本樱',
                        content : '萝莉有三好',
                        img : 'left_meng_img.png',
                        href : 'https://www.baidu.com'
                    },
                    {
                        text : '萌萌哒',
                        icon : 'left_meng.png',
                        title : '猫耳朵萝莉千本樱',
                        content : '萝莉有三好',
                        img : 'left_meng_img.png',
                        href : 'https://www.baidu.com'
                    },
                    {
                        text : '萌萌哒',
                        icon : 'left_meng.png',
                        title : '猫耳朵萝莉千本樱',
                        content : '萝莉有三好',
                        img : 'left_meng_img.png',
                        href : 'https://www.baidu.com'
                    },
                    {
                        text : '萌萌哒',
                        icon : 'left_meng.png',
                        title : '猫耳朵萝莉千本樱',
                        content : '萝莉有三好',
                        img : 'left_meng_img.png',
                        href : 'https://www.baidu.com'
                    },
                    {
                        text : '萌萌哒',
                        icon : 'left_meng.png',
                        title : '猫耳朵萝莉千本樱',
                        content : '萝莉有三好',
                        img : 'left_meng_img.png',
                        href : 'https://www.baidu.com'
                    }
                ]

            } ;
            // 配置数据,页面加载时即提供
            M.conf = {
                /* 模拟数据 */
                // 侧边导航动画配置数据
                slideBarCloseAnimate : false
            } ;
            // 返回数据模型层对象操作方法
            return {
                // 获取服务器端数据
                getData : function(m) {
                    // 根据数据字段获取数据
                    return M.data[m] ;
                },
                // 获取配置数据
                getConf : function(c) {
                    // 根据配置数据字段获取配置数据
                    return M.conf[c] ;
                },
                // 设置服务器端数据(通常将服务器端异步获取到的数据,更新该数据)
                setData : function(m, v) {
                    // 设置数据字段m对应的数据v
                    M.data[m] = v ;
                    return this ;
                },
                // 设置配置数据(通常在页面中执行某些操作,为做记录而更新配置数据)
                setConf : function(c, v) {
                    M.conf[c] = v ;
                    return this ; 
                }
            }
        })() ;
        // 初始化MVC视图层
        MVC.view = (function() {
            // 模型数据层对象操作方法引用
            var M = MVC.model ;
            // 内部视图创建方法对象
            var V = {
                /* 模拟数据 */
                // 创建侧边导航模块视图
                createSlideBar : function() {
                    // 导航图标内容
                    var html = '' ;
                    // 视图渲染数据
                    var data = M.getData('slideBar') ;
                    // 屏蔽无效数据
                    if(!data || !data.length) {
                        return ;
                    }
                    // 创建视图容器(参考附录A中,A框架中创建元素方法create)
                    var dom = $.create('div', {
                        'id' : 'slideBar',
                        'class' : 'slideBar'
                    }) ;
                    // 视图容器模板
                    var tpl = {
                        container : [
                            '<div class="slidebar-inner"><ul>{#content#}</ul></div>',
                            ''
                        ].join('') ;
                        // 导航图标模块模板
                        item : [
                            '<li>',
                                '<a class="icon" href="{#href#}">',
                                    '<img src="common/img/{#icon#}">',
                                    '<span>{#text#}</span>',
                                '</a>',
                                '<div class="box">',
                                    '<div>',
                                        '<a class="title" href="{#href#}">{#title#}</a>',
                                        '<a href="{#href#}">{#content#}</a>',
                                    '</div>', 
                                    '<a class="image" href="{#href#}"><img src="common/img/{#img#}"></a>',
                                '</div>',
                            '</li>'
                        ].join('') ;

                        // 渲染全部导航图片模块
                        for(var i = 0; i < data.length; i++) {
                            html += $.formateString(tpl.item, data[i]) ;
                        }
                        // 在页面中创建侧边导航视图
                        dom
                            // 向侧边导航模块容器中插入侧边导航视图
                            .html(
                                // 渲染导航视图(content为导航图片内容)
                                $.formateString(tpl.container, {content : html}) ;
                            )
                            // 将侧边导航模块容器插入页面中
                            .appendTo('body') ;
                    }
                }
            } ;
            // 获取视图接口方法
            return function(v) {
                // 根据视图名称返回视图(由于获取的是一个方法,这里需要将该方法执行以便以获取相应视图)
                V[v]() ;
            }
        })() ;
        // 初始化MVC控制器层
        MVC.ctrl = (function() {
            // 模型数据层对象操作方法引用
            var M = MVC.model ;
            // 视图数据层对象操作方法引用
            var V = MVC.view ;
            // 控制器创建方法对象
            var C = {
                // 侧边导航栏模块
                initSlideBar : function() {
                    // 渲染导航栏模块视图
                    V('createSlideBar') ;
                    // 为每一个导航图标添加鼠标光标滑过与鼠标光标离开交互事件(具体方法参考附录A中的A框架)
                    $('li', 'slidebar')
                        // 鼠标移入导航icon(图标)显示导航浮层
                        .on('mouseover', function(e) {
                            $(this).addClass('show') ;
                        })
                        // 鼠标移出导航icon(图标)隐藏导航浮层
                        .on('mouseout', function(e) {
                            $(this).removeClass('show') ;
                        }) ; 
                    // 箭头icon(图标)动画交互
                    $('.slidebar-close', 'slidebar')
                        // 点击箭头icon时
                        .on('click', function(e) {
                            // 如果正在执行动画
                            if(M.getConf('slideBarCloseAnimate')) {
                                // 终止动画
                                return false ;
                            }
                            // 设置侧边导航模块动画配置数据开关为打开状态
                            M.setConf('slideBarCloseAnimate', true) ;
                            // 获取当前元素(箭头icon)
                            var $this = $(this) ;
                            // 如果箭头icon是关闭状态(含有is-close类)
                            if($this.hasClass('is-close')) {
                                // 为侧边导航模块添加显示动画
                                $('.slidebar-inner', 'slidebar')
                                .animate({
                                    // 动画时间
                                    duration : 800,
                                    // 动画类型
                                    type : 'easeOutQuart',
                                    // 动画主函数
                                    main : function(dom) {
                                        // 每一帧改变导航模块容器left值
                                        dom.css('left', -50 + this.tween * 50 + 'px') ;
                                    },
                                    // 动画结束时回调函数
                                    end : function() {
                                        // 设置箭头icon为打开状态(删除is-close)类
                                        $this.removeClass('is-close') ;
                                        // 设置侧边导航模块动画配置数据开关为关闭状态(此时可继续进行模块显隐动画交互)
                                        M.setConf('slideBarCloseAnimate', false) ;
                                    }
                                }) ;
                            // 如果箭头icon是打开状态(不含is-close类)    
                            }else {
                                // 为侧边导航模块添加显示动画
                                $('.slidebar-inner', 'slidebar')
                                .animate({
                                    // 动画时间
                                    duration : 800,
                                    // 动画类型
                                    type : 'easeOutQuart',
                                    // 动画主函数
                                    main : function(dom) {
                                        // 每一帧改变导航模块容器left值
                                        dom.css('left', this.tween * -50 + 'px') ;
                                    },
                                    // 动画结束时回调函数
                                    end : function() {
                                        // 设置箭头icon为打开状态(删除is-close)类
                                        $this.addClass('is-close') ;
                                        // 设置侧边导航模块动画配置数据开关为关闭状态(此时可继续进行模块显示动画交互)
                                        M.setConf('slideBarCloseAnimate', false) ;
                                    }
                                }) ;
                            }
                        }) ;
                }
            } ;

            // 为侧边导航模块添加交互与动画特效
            C.initSlideBar() ;      // 也可把函数写成自执行函数
        })() ;
    }) ;


</script>    

</body>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值