介绍

本人菜鸟,一些自己的浅薄见解,望各位大神指正。

本框架有以下优点

1、简单(调用简单、实现简单、不过度设计)

2、视图、控制器、模型分离(分离对于维护十分有必要)

3、组件化(每一个mvc模块儿的实现都是一个组件的实现,M+V+C = 组件)

视图
 <div id="iceDiscussView">
<!--List 评论主体模板-->
<div id="iceDiscussViewBody">
<span class="ll">
<textarea id="@{iceId1}" data-id="iceTxtContent" rows="3" cols="50" invalue="发表点什么吧……" style="color: black;"></textarea></span> <span class="ll">
<input id="iceBtnSub" type="button" value="发送" style="height: 54px;" /></span>
<br class="clear">
<span><a href="javascript:void(0)" onclick="FACE.Show('@{iceId1}',this)"><img src="/img/face/bq_btn.png" /></a> <a href="javascript:void(0)" id="iceDiscussShow">展开评论<span id="iceDiscussCount"></span></a> </span>
<div id="iceDiscussPanel" >
</div>
</div> <!--List 模板-->
<div id="iceDiscussViewList" style='padding:5px 3px 5px 3px; border:1px dotted #cccccc'>
<div style="height:40px;"> <strong> @{userName}:发表于@{insTime}</strong>
</div>
<div>@{content}</div>
<div>
<a id="iceDiscussReplyLink" href="javascript:void(0)" data-discussId="@{discussId}" >回复<span>@{replyCountStr}</span></a>
<br />
</div>
<div id="iceDiscussReplyList"> </div>
</div> <div id="iceDiscussViewRepyList" style='padding:5px 3px 5px 25px; border:1px dotted #cccccc'>
<div style="height:40px;"> <strong> @{userName}:回复你@{insTime}</strong>
</div>
<div>@{content}</div>
</div> </div>

视图就不用说了,其实也可以叫他模板。@{userName}这些标志会替换成相应的数据。

比较特殊的是@{iceId1} 他会替换成一个随机id。

模型
 function DiscussModel() {
this.GetList = function () {
var list = [{ discussId:1,userName: "张三", content: "你好,空间不错!", insTime: "2013-08-01", replyCount: 0 }
, { discussId: 2, userName: "李四", content: "你好,空间不错!", insTime: "2013-08-01", replyCount: 3 }
] $.each(list, function (i,data) {
if (data.replyCount == 0) {
data.replyCountStr = "";
} else {
data.replyCountStr = "("+data.replyCount+")";
}
}) return list;
}
this.GetListCount = function () {
return 2;
}
this.Add = function (content, userName) {
var data = { content: content, userName: userName, insTime: IceMx.Date.Now()}
//这里是aja提交方法
return data;
} this.GetListReply = function (discussId) {
if(discussId==2){
return [{ userName: "IceMx", content: "谢谢关注!", insTime: "2013-8-31" }
]
}
}
}

主要负责数据的处理,这里是模拟了数据,实际情况可能会是通过ajax从后台返回,目前只支持ajax的同步模式,异步模式我还没有处理。

控制器
var DiscussController = IceMx.Mvc.NewController("Discuss", function () {

    //定义局部变量
var model = new DiscussModel(),
_self = this,
$body = $(IceMx.Model.Format(this.GetView("#iceDiscussViewBody").toString(), {})),
$txt = this.GetView("[data-id='iceTxtContent']", $body),
$btnSub = this.GetView("#iceBtnSub", $body),
$iceDiscussShow = this.GetView("#iceDiscussShow", $body),
$iceDiscussCount = this.GetView("#iceDiscussCount", $body),
$replyMuBan = this.GetView("#iceDiscussViewRepyList").toString(),
discussCount = 0; //定义模板
this.listMuBan = this.GetView("#iceDiscussViewList").toString(); //私有方法
function SetDiscussCount(count) {
if (typeof count == "string") {
eval("discussCount=discussCount" + count);
} else {
discussCount = count;
} if (discussCount == 0) {
return;
}
$iceDiscussCount.html("(" + discussCount + ")");
}
function Init() {
IceMx.Common.BindDefaultText($txt).BindEnter($txt, function () {
$btnSub.click();
}); $btnSub.click(function () {
_self.Add($txt.val(), "王龙").appendTo("#iceDiscussPanel", $body);
}); SetDiscussCount(model.GetListCount());
} //共有方法
this.GetListHtml = function () {
var list = model.GetList(),
htm = ""; $.each(list, function (i,data) {
htm += IceMx.Model.Format(_self.listMuBan, data);
}) var discussHtm = $(htm);
discussHtm.delegate("#iceDiscussReplyLink", "click", function () { var discussId=this.attributes["data-discussId"].value,
list = model.GetListReply(discussId),
$this= $(this),
htm = ""; if(list){
$.each(list, function (i, data) {
htm += IceMx.Model.Format($replyMuBan, data);
}) _self.GetView("#iceDiscussViewList", $this).find("#iceDiscussReplyList").append(htm);
}
}) SetDiscussCount(list.length); return discussHtm;
} this.GetBody = function () {
$body = $(IceMx.Model.Format(this.GetView("#iceDiscussViewBody").toString(), {})),
$body.find("#iceDiscussPanel").html("").append(this.GetListHtml());
return $body;
} this.Add = function (content, userName) {
var data = model.Add(content, userName);
var htm = IceMx.Model.Format(_self.listMuBan, data); SetDiscussCount("+1");
$txt.val("").blur();
IceMx.tip("提交成功……");
return $(htm);
} Init();
});

控制器主要负责作为数据和视图的桥梁,视图内一些事件也是通过它来注册的。

这里的 this.GetView 是获取视图,之所以可以这样用原因是在组件加载的时候进行了视图绑定到控制器。

调用端
     <script>
var discussController, FACE; IceMx.Mvc.Get("Discuss","Face"); IceMx.Event.AddEvent("MvcLoadOver", function () {
FACE = new FaceController();
discussController = new DiscussController();
discussController.GetBody().appendTo("#panelDiscuss");
});
</script>
</head>
<body>
<form id="form1" runat="server">
<h1>Js Mvc 模式体验</h1>
<div style="border:1px solid #cccccc ; padding:5px;"><span><b>基于js的mvc三层架构设计体验</b></span> <div style="background-color:#f8f8f8;padding:10px;">
<p>尝试用异步加载的mvc方式来实现一个评论功能。</p>
<p>1、Controller 实现和页面的交互 。</p>
<p>2、Model 负责和数据层交互。</p>
<p>2、View 页面上的html代码模板。</p>
<p>
异步加载:不需要事先应用mvc的js和其他内容。
加载代码:IceMx.Mvc.Get("Discuss","Face");
</p>
<p>该代码加载了两个mvc模块,加载后将通知 MvcLoadOver 的注册者,在该事件内可以进行下一步处理。</p>
</div>
<br />
<div id="panelDiscuss"> </div>
</div>
</form>
</body>
</html>
调用端的代码就比较简单了
在页面只需要引入jquery 、和IceMx.Mvc 。
在调用IceMx.Mvc.Get("Discuss","Face");的时候会载入视图、控制器、模型并且把视图绑定到控制器内部。
这里评论模块儿感觉上像一个组件,因为可以通过控制器来调用整个模块儿,其实控制器就是这个组件的代表,也就实现了组件化。
如果控制器加一些参数配置这个组件就可以适应多种场合了。
总结

这就是我的一个思路和实现步骤,请各位大神指教。

其他

若有兴趣请关注分类下的其他文章,如果能得到您的支持将不甚感激。

IceMx.Mvc 我的js MVC 框架 三、动手来写一个评论模块儿的更多相关文章

  1. 郑晔谈 Moco 框架的开发:写一个好的内部 DSL ,写一个表达性好的程序

    作者:张龙 出处:http://www.infoq.com/cn/news/2013/07/zhengye-on-moco 郑晔谈Moco框架的开发:写一个好的内部DSL,写一个表达性好的程序 作者  ...

  2. go server框架学习之路 - 写一个自己的go框架

    go server框架学习之路 - 写一个自己的go框架 用简单的代码实现一个go框架 代码地址: https://github.com/cw731/gcw 1 创建一个简单的框架 代码 packag ...

  3. IceMx.Mvc 我的js MVC 框架 开篇

    开篇 这篇文章是后补的,前端时间想写一些对于js开发的一些理解,就直接写了,后来发现很唐突,所以今天在这里补一个开篇. 我的js Mvc 框架 基于实用设计,过分设计等于没设计.本着简单的原则,它只实 ...

  4. IceMx.Mvc 我的js MVC 框架五、完善植物大战僵尸(雏形版增加动画)

    有图有真相 说明 实在找不到僵尸的素材,从网上扒了一个山寨的僵尸,只有4张的一个连续图片,所以动作有点僵硬,植物的图片是自己处理的,非专业所以……咳咳!. 背景是自己抠下来2块儿拼接的,看在这么辛苦的 ...

  5. IceMx.Mvc 我的js MVC 框架 一、html代码的分离(视图)

    介绍 本人菜鸟,一些自己的浅薄见解,望各位大神指正. 本框架有以下优点 1.简单(调用简单.实现简单.不过度设计) 2.视图.控制器.模型分离(分离对于维护十分有必要) 3.组件化(每一个mvc模块儿 ...

  6. 使用node.js 文档里的方法写一个web服务器

    刚刚看了node.js文档里的一个小例子,就是用 node.js 写一个web服务器的小例子 上代码 (*^▽^*) //helloworld.js// 使用node.js写一个服务器 const h ...

  7. linux设备驱动第三篇:写一个简单的字符设备驱动

          在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分 ...

  8. IceMx.Mvc 我的js MVC 框架 二、视图的数据绑定

    介绍 本人菜鸟,一些自己的浅薄见解,望各位大神指正. 本框架有以下优点 1.简单(调用简单.实现简单.不过度设计) 2.视图.控制器.模型分离(分离对于维护十分有必要) 3.组件化(每一个mvc模块儿 ...

  9. IceMx.Mvc 我的js MVC 框架四、试水植物大战僵尸(雏形版)

    有图有真相 开始 最近老婆在家迷上了植物大战僵尸,每天回去躺床上就玩,有一天居然跟我说冰箱后边爬着好几只僵尸,当时我就惊呆了,后来才知道她是在说蟑螂,我去. 闲言少叙,书归正传,这是一个雏形,没有在界 ...

随机推荐

  1. 【专访】【Spring常见问题汇总】【05】

    种: 传播行为:传播行为定义了client与彼调用方法之间的事务边界. 隔离级别:隔离级别定义了一个事务可能受其它并发事务影响的程度. 仅仅读:表明事务是否是仅仅读的. 事务超时:指定事务执行的最长时 ...

  2. CSS3+HTML5特效6 - 闪烁的文字

    先看效果 abcd 这个效果也比较简单,利用keyframes对文字的大小.透明度及颜色做循环显示. CSS <style> @-webkit-keyframes flash { 0%{ ...

  3. java23种设计模式详解(转)

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  4. Windows socket之最简单的socket程序

    原文:Windows socket之最简单的socket程序 最简单的服务器的socket程序流程如下(面向连接的TCP连接 ): 1. WSAStartup(); 初始化网络库的使用. 2. soc ...

  5. addEventListener

    addEventListener addEventListener-开始 前面零散地写了些关于 addEventListener 的内容,觉得比较散,有些地方可能也说得不够清楚明白,所以决定以连载的形 ...

  6. JS实现全选,用于界面批量操作向后台传值时使用

    function seltAll(){ var chckBoxSign = document.getElementById("ckb"); //ckb 全选/反选的选择框id va ...

  7. jQuery库(noConflict)冲突解决机制

    很多JSFramework库选择使用$符号作为一个函数或变量名,而在实际的项目开发,模板语言,则有可能"$"符号是模板语言keyword.例如Veclocity模板语言,$它是ke ...

  8. HTML页面的动画的制作及性能

    原文:HTML页面的动画的制作及性能 WEB页面的动画的制作及性能 简介 目前WEB页面做动画的方式大的分两种1.JS间隔时间不断修改元素属性值,这也是CSS3出来前常用的做法,貌似也是唯一的做法.2 ...

  9. 非常多人不愿意承认汉澳sinox已经超过windows

    汉澳sinox採用的zfs和jail打造高可靠性存储server和矩阵计算机,这不是windows和linux能相提并论的. 只是非常多人立即出来出来反驳说,windows驱动程序多(就是支持硬件多) ...

  10. android简单的计算器

    所使用的算法:表达式求值(中缀表达式转后缀表达式,后缀表达式求值值) 不如何设计接口,有时间来美化! MainActivity.java package com.example.calculator; ...