IceMx.Mvc 我的js MVC 框架 三、动手来写一个评论模块儿
介绍
本人菜鸟,一些自己的浅薄见解,望各位大神指正。
本框架有以下优点
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 框架 三、动手来写一个评论模块儿的更多相关文章
- 郑晔谈 Moco 框架的开发:写一个好的内部 DSL ,写一个表达性好的程序
作者:张龙 出处:http://www.infoq.com/cn/news/2013/07/zhengye-on-moco 郑晔谈Moco框架的开发:写一个好的内部DSL,写一个表达性好的程序 作者 ...
- go server框架学习之路 - 写一个自己的go框架
go server框架学习之路 - 写一个自己的go框架 用简单的代码实现一个go框架 代码地址: https://github.com/cw731/gcw 1 创建一个简单的框架 代码 packag ...
- IceMx.Mvc 我的js MVC 框架 开篇
开篇 这篇文章是后补的,前端时间想写一些对于js开发的一些理解,就直接写了,后来发现很唐突,所以今天在这里补一个开篇. 我的js Mvc 框架 基于实用设计,过分设计等于没设计.本着简单的原则,它只实 ...
- IceMx.Mvc 我的js MVC 框架五、完善植物大战僵尸(雏形版增加动画)
有图有真相 说明 实在找不到僵尸的素材,从网上扒了一个山寨的僵尸,只有4张的一个连续图片,所以动作有点僵硬,植物的图片是自己处理的,非专业所以……咳咳!. 背景是自己抠下来2块儿拼接的,看在这么辛苦的 ...
- IceMx.Mvc 我的js MVC 框架 一、html代码的分离(视图)
介绍 本人菜鸟,一些自己的浅薄见解,望各位大神指正. 本框架有以下优点 1.简单(调用简单.实现简单.不过度设计) 2.视图.控制器.模型分离(分离对于维护十分有必要) 3.组件化(每一个mvc模块儿 ...
- 使用node.js 文档里的方法写一个web服务器
刚刚看了node.js文档里的一个小例子,就是用 node.js 写一个web服务器的小例子 上代码 (*^▽^*) //helloworld.js// 使用node.js写一个服务器 const h ...
- linux设备驱动第三篇:写一个简单的字符设备驱动
在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分 ...
- IceMx.Mvc 我的js MVC 框架 二、视图的数据绑定
介绍 本人菜鸟,一些自己的浅薄见解,望各位大神指正. 本框架有以下优点 1.简单(调用简单.实现简单.不过度设计) 2.视图.控制器.模型分离(分离对于维护十分有必要) 3.组件化(每一个mvc模块儿 ...
- IceMx.Mvc 我的js MVC 框架四、试水植物大战僵尸(雏形版)
有图有真相 开始 最近老婆在家迷上了植物大战僵尸,每天回去躺床上就玩,有一天居然跟我说冰箱后边爬着好几只僵尸,当时我就惊呆了,后来才知道她是在说蟑螂,我去. 闲言少叙,书归正传,这是一个雏形,没有在界 ...
随机推荐
- Spring + Spring MVC + Hibernate
Spring + Spring MVC + Hibernate项目开发集成(注解) Posted on 2015-05-09 11:58 沐浴未来的我和你 阅读(307) 评论(0) 编辑 收藏 在自 ...
- Python美女[从新手到高手]--阅读"见个面问题 HashMap 储存方法"联想
今伯乐在线 上看到一篇文章.一道面试题看 HashMap 的存储方式.也就是问: 在 HashMap 中存放的一系列键值对,当中键为某个我们自己定义的类型.放入 HashMap 后,我们在外部把某一个 ...
- mysql中国的内容php网页乱码问题
1.更改mysql编码在数据库 character_set_server=utf8 init_connect='SET NAMES utf8' 加入这两行 2.又第一次启动mysql数据库 版权声明: ...
- C#随机双色球
using System; using System.Collections.Generic; namespace ConsoleApplicationRandnumber { class Progr ...
- dedeCMS中单独调用子栏目模板和子栏目的文章时修改源代码给channel和chanenartllist加上limit
在网站文件中找到include-taglib-chanel.lib.php,和chaneartllist.lib.php 下载用php的IDE打开, chanel.php加入limit属性修改如下 & ...
- 小记NodeJS两项小技巧(与HTTP相关)
1,兼容HTTP1.1和HTTP1.0 区别在content-length,1.0接受定长,不接受变长,导致transfer-encodeing的chunked模式无法识别,最终导致无法识别BODY. ...
- 《Windows游戏编程技巧大师》就DirectDraw而创建DirectDraw知识笔记
1.DirectDraw 这可能是Directx中最重要的技术,由于它是2D图形赖以实现的渠道.也是Direct3D构建于其上的帧缓冲层. 2.DirectDraw是由非常多借口组成的.共同拥有5个接 ...
- mysql分表分库
单库单表 单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到. 单库多表 随着用户数量的增加,user表的数据量会越来越大,当数 ...
- C语言库函数大全及应用实例二
原文:C语言库函数大全及应用实例二 [编程资料]C语言库函数大全及应用实例二 函数名: bioskey 功 能 ...
- Android4.3引入的UiAutomation新框架官方简介
译者序:Google在Android 4.3发布时提供了一套新的UiAutomation框架来支持用户界面自动化测试,该框架通过运用已有的Accessibility APIs来模拟用户跟设备用户界面的 ...