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 框架四、试水植物大战僵尸(雏形版)
有图有真相 开始 最近老婆在家迷上了植物大战僵尸,每天回去躺床上就玩,有一天居然跟我说冰箱后边爬着好几只僵尸,当时我就惊呆了,后来才知道她是在说蟑螂,我去. 闲言少叙,书归正传,这是一个雏形,没有在界 ...
随机推荐
- iOS:Block写递归
首先来一个 oc 的递归: - (int)sum:(int)num { ) { return num; } ]; } 写递归算法只需要记住两点即可: 1. 有一个明确的出口 2. 不满足条件出口时,自 ...
- 【高德地图API】汇润做爱地图技术大揭秘
原文:[高德地图API]汇润做爱地图技术大揭秘 昨日收到了高德地图微信公众号的消息推送,说有[一大波免费情趣用品正在袭来],点进去看了一眼,说一个电商公司(估计是卖情趣用品的)用高德云图制作了一张可以 ...
- 教你一步一步部署.net免费空间OpenShift系列之四------绑定域名、使用CDN加速
很抱歉这几天没有时间,有人问我怎么绑定域名的问题也没有答复,下面进入正题,惊闻ASP.Net要开源了,难道.Net春天要来了?不废话,上回书说,部署完毕ASP.Net网站后,直接访问不能访问(嗯,众所 ...
- C#中使用ref 和 out 的一点认识
ref 通常我们向方法中传递的是值,方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢弃,而原来的值不会受到影响. 这种情况是通常的,当然还有另外一种情况,我们向方法传递 ...
- hdu1848 Fibonacci again and again(SG游戏功能)
现在的变化是看不清楚SG功能什么寻求方法 临时模板标题是首当 性能mex1它正在寻求g(x) 然后XOR #include<cstdio> #include<iostream> ...
- Codeforces 474A Keyboard (水
题目链接:点击打开链接 键盘移位了,问输出相应的字母 #include <cstdio> #include <cstring> char a[105]; char b[3][1 ...
- POJ 3390 Print Words in Lines(DP)
Print Words in Lines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1624 Accepted: 864 D ...
- [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)
原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日 ...
- Spring Resource之内置的Resource实现
Spring提供了大量的并且可以直接使用的Resource实现 1.UrlResource UrlResource封装了一个java.net.URL,而且可以通过一个URL用于访问任何对象,例如文件. ...
- Linux下的C程序如何调用系统命令,并获取系统的输出信息到C程序中
直接贴代码: #include <stdio.h> #include <string.h> #include <errno.h> int main(int argc ...