介绍

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

本框架有以下优点

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

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

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

视图
  1. <div id="iceDiscussView">
  2. <!--List 评论主体模板-->
  3. <div id="iceDiscussViewBody">
  4. <span class="ll">
  5. <textarea id="@{iceId1}" data-id="iceTxtContent" rows="3" cols="50" invalue="发表点什么吧……" style="color: black;"></textarea></span> <span class="ll">
  6. <input id="iceBtnSub" type="button" value="发送" style="height: 54px;" /></span>
  7. <br class="clear">
  8. <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>
  9. <div id="iceDiscussPanel" >
  10. </div>
  11. </div>
  12.  
  13. <!--List 模板-->
  14. <div id="iceDiscussViewList" style='padding:5px 3px 5px 3px; border:1px dotted #cccccc'>
  15. <div style="height:40px;"> <strong> @{userName}:发表于@{insTime}</strong>
  16. </div>
  17. <div>@{content}</div>
  18. <div>
  19. <a id="iceDiscussReplyLink" href="javascript:void(0)" data-discussId="@{discussId}" >回复<span>@{replyCountStr}</span></a>
  20. <br />
  21. </div>
  22. <div id="iceDiscussReplyList">
  23.  
  24. </div>
  25. </div>
  26.  
  27. <div id="iceDiscussViewRepyList" style='padding:5px 3px 5px 25px; border:1px dotted #cccccc'>
  28. <div style="height:40px;"> <strong> @{userName}:回复你@{insTime}</strong>
  29. </div>
  30. <div>@{content}</div>
  31. </div>
  32.  
  33. </div>

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

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

模型
  1. function DiscussModel() {
  2. this.GetList = function () {
  3. var list = [{ discussId:1,userName: "张三", content: "你好,空间不错!", insTime: "2013-08-01", replyCount: 0 }
  4. , { discussId: 2, userName: "李四", content: "你好,空间不错!", insTime: "2013-08-01", replyCount: 3 }
  5. ]
  6.  
  7. $.each(list, function (i,data) {
  8. if (data.replyCount == 0) {
  9. data.replyCountStr = "";
  10. } else {
  11. data.replyCountStr = "("+data.replyCount+")";
  12. }
  13. })
  14.  
  15. return list;
  16. }
  17. this.GetListCount = function () {
  18. return 2;
  19. }
  20. this.Add = function (content, userName) {
  21. var data = { content: content, userName: userName, insTime: IceMx.Date.Now()}
  22. //这里是aja提交方法
  23. return data;
  24. }
  25.  
  26. this.GetListReply = function (discussId) {
  27. if(discussId==2){
  28. return [{ userName: "IceMx", content: "谢谢关注!", insTime: "2013-8-31" }
  29. ]
  30. }
  31. }
  32. }

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

控制器
  1. var DiscussController = IceMx.Mvc.NewController("Discuss", function () {
  2.  
  3. //定义局部变量
  4. var model = new DiscussModel(),
  5. _self = this,
  6. $body = $(IceMx.Model.Format(this.GetView("#iceDiscussViewBody").toString(), {})),
  7. $txt = this.GetView("[data-id='iceTxtContent']", $body),
  8. $btnSub = this.GetView("#iceBtnSub", $body),
  9. $iceDiscussShow = this.GetView("#iceDiscussShow", $body),
  10. $iceDiscussCount = this.GetView("#iceDiscussCount", $body),
  11. $replyMuBan = this.GetView("#iceDiscussViewRepyList").toString(),
  12. discussCount = 0;
  13.  
  14. //定义模板
  15. this.listMuBan = this.GetView("#iceDiscussViewList").toString();
  16.  
  17. //私有方法
  18. function SetDiscussCount(count) {
  19. if (typeof count == "string") {
  20. eval("discussCount=discussCount" + count);
  21. } else {
  22. discussCount = count;
  23. }
  24.  
  25. if (discussCount == 0) {
  26. return;
  27. }
  28. $iceDiscussCount.html("(" + discussCount + ")");
  29. }
  30. function Init() {
  31. IceMx.Common.BindDefaultText($txt).BindEnter($txt, function () {
  32. $btnSub.click();
  33. });
  34.  
  35. $btnSub.click(function () {
  36. _self.Add($txt.val(), "王龙").appendTo("#iceDiscussPanel", $body);
  37. });
  38.  
  39. SetDiscussCount(model.GetListCount());
  40. }
  41.  
  42. //共有方法
  43. this.GetListHtml = function () {
  44. var list = model.GetList(),
  45. htm = "";
  46.  
  47. $.each(list, function (i,data) {
  48. htm += IceMx.Model.Format(_self.listMuBan, data);
  49. })
  50.  
  51. var discussHtm = $(htm);
  52. discussHtm.delegate("#iceDiscussReplyLink", "click", function () {
  53.  
  54. var discussId=this.attributes["data-discussId"].value,
  55. list = model.GetListReply(discussId),
  56. $this= $(this),
  57. htm = "";
  58.  
  59. if(list){
  60. $.each(list, function (i, data) {
  61. htm += IceMx.Model.Format($replyMuBan, data);
  62. })
  63.  
  64. _self.GetView("#iceDiscussViewList", $this).find("#iceDiscussReplyList").append(htm);
  65. }
  66. })
  67.  
  68. SetDiscussCount(list.length);
  69.  
  70. return discussHtm;
  71. }
  72.  
  73. this.GetBody = function () {
  74. $body = $(IceMx.Model.Format(this.GetView("#iceDiscussViewBody").toString(), {})),
  75. $body.find("#iceDiscussPanel").html("").append(this.GetListHtml());
  76. return $body;
  77. }
  78.  
  79. this.Add = function (content, userName) {
  80. var data = model.Add(content, userName);
  81. var htm = IceMx.Model.Format(_self.listMuBan, data);
  82.  
  83. SetDiscussCount("+1");
  84. $txt.val("").blur();
  85. IceMx.tip("提交成功……");
  86. return $(htm);
  87. }
  88.  
  89. Init();
  90. });

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

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

调用端
  1. <script>
  2. var discussController, FACE;
  3.  
  4. IceMx.Mvc.Get("Discuss","Face");
  5.  
  6. IceMx.Event.AddEvent("MvcLoadOver", function () {
  7. FACE = new FaceController();
  8. discussController = new DiscussController();
  9. discussController.GetBody().appendTo("#panelDiscuss");
  10. });
  11. </script>
  12. </head>
  13. <body>
  14. <form id="form1" runat="server">
  15. <h1>Js Mvc 模式体验</h1>
  16. <div style="border:1px solid #cccccc ; padding:5px;"><span><b>基于js的mvc三层架构设计体验</b></span>
  17.  
  18. <div style="background-color:#f8f8f8;padding:10px;">
  19. <p>尝试用异步加载的mvc方式来实现一个评论功能。</p>
  20. <p>1、Controller 实现和页面的交互 。</p>
  21. <p>2、Model 负责和数据层交互。</p>
  22. <p>2、View 页面上的html代码模板。</p>
  23. <p>
  24. 异步加载:不需要事先应用mvc的js和其他内容。
  25. 加载代码:IceMx.Mvc.Get("Discuss","Face");
  26. </p>
  27. <p>该代码加载了两个mvc模块,加载后将通知 MvcLoadOver 的注册者,在该事件内可以进行下一步处理。</p>
  28. </div>
  29. <br />
  30. <div id="panelDiscuss">
  31.  
  32. </div>
  33. </div>
  34. </form>
  35. </body>
  36. </html>
  1. 调用端的代码就比较简单了
    在页面只需要引入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. 【Unity 3D】学习笔记三十八:角色控制器

    角色控制器 在unity中,已经帮我们实现的上下左右跳等动作,并将他们封装成了角色控制器.角色控制器保存在unity标准资源包中,能够说是很的强大.能够模拟第一或者第三人称视角.不受刚体的限制,很适用 ...

  2. MAC使用小技巧(一)

    [ Mac OS X 终端命令开启功能 ] 1.Lion下显示资源库方法一:显示在“终端”中输入下面的命令:chflags nohidden ~/Library/ 隐藏在“终端”中输入下面的命令:ch ...

  3. 持续交付工具ThoughtWorks Go部署step by step

    持续交付工具ThoughtWorks Go部署step by step http://blogs.360.cn/360cloud/2014/05/13/%E6%8C%81%E7%BB%AD%E4%BA ...

  4. (转)javabean操作文件正确,但是Jsp调用javabean时文件路径出错问题解决之JavaBean访问本地文件实现路径无关实现方法

        在JSP中,页面链接是使用web路径的,但如果JavaBean要访问本地文件读取配置信息的话,是需要文件的本地路径的.如果你在写 Bean的时候直接将本地路径写进去,那网站的路径就不能变化,丧 ...

  5. 【百度地图API】如何在地图上添加标注?——另有:坐标拾取工具+打车费用接口介绍

    原文:[百度地图API]如何在地图上添加标注?--另有:坐标拾取工具+打车费用接口介绍 摘要: 在这篇文章中,你将学会,如何利用百度地图API进行标注.如何使用API新增的打车费用接口. ------ ...

  6. MySQL检查连接的最大数量和改变的最大连接数

    版权声明:本文博主原创文章.博客,未经同意不得转载.

  7. Socket 学习(三).1 tcp 通讯

    实现了,局域网客户端 对客户端 的通讯. 实际上这是 一个 客户端 兼 服务端 . 2个阿里云服务器测试 效果图: 本地效果图: using System; using System.Collecti ...

  8. POI导出Excel文档通用工具方法

    import java.lang.reflect.InvocationTargetException; import java.util.List; import java.util.Map; imp ...

  9. 那些必须要知道的Javascript

    原文:那些必须要知道的Javascript JavaScript是前端必备,而这其中的精髓也太多太多,最近在温习的时候发现有些东西比较容易忽略,这里记录一下,一方面是希望自己在平时应用的时候能够得心应 ...

  10. ActiveReports 9实战教程(2): 准备数据源(设计时、运行时)

    原文:ActiveReports 9实战教程(2): 准备数据源(设计时.运行时) 在上讲中<ActiveReports 9实战教程(1): 手把手搭建环境Visual Studio 2013 ...