学习MCRV模式

引用 《前端开发中的MCRV模式

随着系统页面的脚本控制越来越多,大量的数据处理和界面控制代码散落在页面的角落,系统的修改越来越费劲,感觉js已经不不能仅仅作为网页特效的控制工 具,在了解的很多资料后,前端设计也慢慢变成一个和后台代码一样重要的东西了,他也需要良好的代码和系统结构,而不仅仅作为一个单纯的页面辅助的脚本了。 在后端(这里就是后台代码)mvc盛行的今天,他其实也可以用在js方面。在百度前端上看到篇文章《前端开发中的MCRV模式 》,这里下面的实例代码基本都是借鉴于原文的代码。

本文的代码主要是用jsfiddle 来写代码的,它实在太方便了。当然除了这样原生态(基本不依赖第三方,除了jquery)的写法还是很好理解的,但是这在大系统里面还是可以考虑类似Knockout.js等框架的适用,毕竟其强调模板和绑定可以节约大量时间。

<div id="demo"></div>
<div id="message"></div>
<div class="update">
    <div><label>ID</label><input id="txtId" type="text"></div>
    <div><label>Value</label><input id="txtValue" type="text"></div>
</div>
<div>
    <button id="btnSet">Set</button>
</div>​
 
table{ border:1px solid black; border-collapse:collapse;}
table td{ border:1px solid black; width:200px; height:30px; text-align:center}
.update{ position: relative ; margin-top : 10px; }
.update div{ margin: 5px; }
.update label{ display: block;text-align: right; left: 0; position: absolute; width:100px;}
.update input{ width: 100px; position: relative; margin-left: 120px;}​
 
$(document).ready(function() {
    function FlightModel() {
        this.init = function() {
            this.data = [
                { id: 1, airline: "HO1252"},
                { id: 2, airline: "MU5138"}
            ];
        }

        this.getFlightList = function() {
            return this.data;
        }

        this.getFlightById = function(id) {
            for (var i = 0; i < this.data.length; i++) {
                if (this.data[i].id == id) return this.data[i];
            }
            return null;
        }
    }

    function FlightRenderer() {
        this.init = function() {
            var me = this;
            $('.getprice').live('click', function() {
                var id = $(this).attr('cid');
                me.controller.beginUpdate(id);
            });
            $("#btnSet").bind("click", function() {
                me.controller.setAirline($("#txtId").val(), $("#txtValue").val());
            });
        }
        
        this.beginUpdate=function(flight){
            $("#txtId").val(flight.id);
            $("#txtValue").val(flight.airline);
        }
        this.updateFlight = function(flight) {
            if (flight) {
                var html = "";
                html += "<td>" + flight.airline + "</td>";
                html += "<td><button class='getprice' cid='" + flight.id + "'>getprice</button></td>";
                $("#tr" + flight.id).html(html);
            }
        }
        this.renderFlightList = function(flightList) {
            var html = [];
            $.each(flightList, function() {
                html.push("<tr id='tr" + this.id + "'>");
                html.push("<td>" + this.airline + "</td>");
                html.push("<td><button class='getprice' cid='" + this.id + "'>getprice</button></td>");
                html.push("</tr>");
            });
            $("#demo").append("<table>" + html.join("") + "</table>");
        }
    }

    function FlightController() {
        this.init = function() {
            this.initFlightList();
        }
        this.initFlightList = function() {
            var list = this.model.getFlightList();
            this.renderer.renderFlightList(list);
        }
        this.showMessage = function(id) {
            var flight = this.model.getFlightById(id);
        }
        this.beginUpdate=function(id){
            var flight=this.model.getFlightById(id);
            this.renderer.beginUpdate(flight);
        }
        
        this.setAirline = function(id, airline) {
            var flight = this.model.getFlightById(id);
            if (flight) {
                flight.airline = airline;
                this.renderer.updateFlight(flight);
            }
        }
    }

    function MCR(Controller, Model, Renderer) {
        this.controller = new Controller();
        this.model = new Model();
        this.renderer = new Renderer();
        this.controller.model = this.model;
        this.controller.renderer = this.renderer;
        this.model.controller = this.controller;
        this.renderer.controller = this.controller;
        if (typeof this.model.init == "function") {
            this.model.init();
        }
        if (typeof this.renderer.init == "function") {
            this.renderer.init();
        }
        if (typeof this.controller.init == "function") {
            this.controller.init();
        }
    }
    var mcr = new MCR(FlightController, FlightModel, FlightRenderer);
});​

猜你喜欢

转载自tyny.iteye.com/blog/1493872
今日推荐