- 浏览: 234627 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
annyliyear:
找到的ExtJS实现多选下拉框3个代码 -
yinboxian:
源码太乱了
JXTA中使用JxtaServerPipe和JxtaBiDiPipe实现双向可靠的通信 -
yinboxian:
我的peers第一次执行时可以得到正确的结果,以后就不行了。不 ...
JXTA中基于管道监听方式通信 -
cuizhenfu#gmail.com:
http://www.cnblogs.com/cuizhf
JXTA中使用JxtaServerPipe和JxtaBiDiPipe实现双向可靠的通信 -
luxing44530:
请问, jsp页面如果在 META-INF 中, 改怎么访问? ...
Servlet3.0 新特性之模块化实践
JavaScriptMVC之实战
下面我们通过一个真实的项目例子来实战JavaScriptMVC。
项目名称:人事系统
开发模块:部门管理
开发工具:Eclipse
技术支持:JavaScriptMVC3.2.2
首先,我们需要到www.javascriptmvc.com下载JavaScriptMVC包,然后解压到目录E:\jQuery\javascriptmvc-3.2.2
下,接着我们点击"开始->运行",输入cmd进入Doc窗口,然后在Doc窗口中cd E:\jQuery\javascriptmvc-3.2.2跳转
到该目录下。
下面我们通过JavaScriptMVC提供的命令生成项目工程:personnel
在Doc窗口输入:js jquery/generate/app personnel 命令生成工程。
整个Doc操作过程如下:
C:\Documents and Settings\lyndon.LINYAOLIANG>E:
E:\>cd E:\jQuery\javascriptmvc-3.2.2
E:\jQuery\javascriptmvc-3.2.2>js jquery/generate/app personnel
personnel/personnel.css
personnel/personnel.html
personnel/personnel.js
personnel/personnel.md
personnel/fixtures/fixtures.js
personnel/funcunit.html
personnel/models/models.js
personnel/qunit.html
personnel/scripts/build.html
personnel/scripts/build.js
personnel/scripts/clean.js
personnel/scripts/crawl.js
personnel/scripts/docs.js
personnel/test/funcunit/personnel_test.js
personnel/test/funcunit/funcunit.js
personnel/test/qunit/personnel_test.js
personnel/test/qunit/qunit.js
E:\jQuery\javascriptmvc-3.2.2>
然后在E:\jQuery\javascriptmvc-3.2.2目录下,我们看到一个文件夹personnel,这就是我们的工程。
接着我们需要创建我们需要开发的模块:office 部门管理
接着执行Doc命令:js jquery/generate/scaffold Personnel.Models.Office
生成Office模块的页面。
部门管理模块中部门模块只有2个字段:officeId(不能为空),officeName(可以为空)。
我们首先来完成页面的工作,这部分最提供结果,不提供操作过程,请直接查看工程。
接着我们需要来完成创建,修改部门时检验,在这个校验功能中,我们使用了不少的
插件:
1、jquery/model/validations 校验插件,直接引用这个插件即可。
2、jquery/tie 数据绑定插件
修改这个插件源代码,让这个插件在数据出错时,及时反映出错误。
修改点:
blur : function(el, ev, val){ ev.preventDefault(); if(!this.type && val === undefined){ val = this.element.val(); } this.inst.attr(this.attr, val, this.proxy('setPrev'), this.proxy('setBack')); }, // change : function(el, ev, val){ // console.info('change'); // ev.preventDefault(); // if(!this.type && val === undefined){ // val = this.element.val(); // } // // this.inst.attr(this.attr, val, this.proxy('setPrev'), this.proxy('setBack')); // }, setPrev : function(){ this.element.removeClass("error"); this.element.attr("title",""); }, setBack : function(errors){ this.element.addClass("error"); this.element.attr("title",errors[this.attr][0]); // this.setVal(this.lastValue); },
3、jquery/model 模型
修改这个源代码,让模型在绑定到Form元素上,模型的字段自动绑定到对应的Form下的
input,texterea,select元素上,以名称为准。
当然,我们也可以不修改这个模型,直接在Form下的子元素上加上:
<%= $(el) -> $(el).tie(model,'officeName')%>这句也是同样的效果。
修改源代码,只是为了如果有很多字段的时候,我们一句语句就可以搞定一个Form了。
这个效果是利用了EJS视图的hookup功能,hookup即在视图加载时,如果碰到有对象
存在hookup方法,则会执行这个脚本,这个为我们需要对元素做一些特殊处理很方便,
当然,我们也可以通过View中的helper也可以实现在视图加载时执行helper方法。
修改点:
hookup: function( el ) { var me = this; var shortName = this.constructor._shortName, models = $.data(el, "models") || $.data(el, "models", {}); if(el.nodeName == 'FORM'){ $(el).find("input[name], textarea[name], select[name]").each(function(){ $(this).tie(me,$(this).attr("name")); }); } $(el).addClass(shortName + " " + this.identity()); models[shortName] = this; }
完成校验的最终代码如下:
steal('jquery/model', function(){ /** * @class Personnel.Models.Office * @parent index * @inherits jQuery.Model * Wraps backend office services. */ $.Model('Personnel.Models.Office', /* @Static */ { init : function(){ //officeId不能为空,且它只允许输入[0-9a-zA-z]字符 this.validatePresenceOf('officeId',{message:'部门编号不能为空。'}); this.validateFormatOf('officeId',/[0-9a-zA-z]/, {message:'部门编号只能包含[0-9a-zA-z]字符。'}); }, attributes : { officeId : 'string' }, /** * * id:指定对象模型的Id,即在真实中我们使用对象的唯一Id, * 这个起什么作用呢? * * 在Model中,我们发现无论是修改或者是新建,都是使用save方法, * 但是Model是如何知道,我们执行create还是update呢?这个判断就是 * 靠这个Id了,如果Id存在则说明是修改,没有Id则是新建,Model默认的 * Id:'id',我们可以像下面一样指定Id * 由于这个示例是使用Fixture来执行Ajax,指定Id会影响一些操作, * 所以在这里我们没有修改Id,但是,在真实项目中,我们必须指定Id。 */ //id:'officeId', findAll: function(params,success,error){ return $.ajax({ url: "/offices.json", data:params, fixture:'-offices', success:success, error:error, dataType:'json' }); }, findOne : "/offices/{id}.json", create : "/offices.json", update : "/offices/{id}.json", destroy : "/offices/{id}.json" }, /* @Prototype */ {}); })
下面我们来实现分页的功能,在这里我们实现分页的效果是,本地分页与远程分页结合。
本地分页插件和分页组件都参考别的实现而完成的,分页是如何实现的,请查看源代码。
完成分页的控制器代码如下:
steal( 'jquery/controller', 'jquery/view/ejs', 'jquery/controller/view', 'personnel/models' ) .then( './views/init.ejs', './views/office.ejs', './views/detail.ejs', './views/editor.ejs', function($){ /** * @class Personnel.Office.List * @parent index * @inherits jQuery.Controller * Lists offices and lets you destroy them. */ $.Controller('Personnel.Office.List', /** @Static */ { defaults : {} }, /** @Prototype */ { init : function(){ this.element.html(this.view('init') ); var paging = new PagingMemory({controller:this,model:Personnel.Models.Office,tableId:'officelist'}); paging.list(10,1,5); }, '#officelist a.detail click': function( el ){ this.element.html(this.view('detail',el.closest('.office').model())); }, '#officelist a.destroy click': function( el ){ this.element.html(this.view('detail',el.closest('.office').model())); }, '#officelist a.update click': function( el ){ this.model = el.closest('.office').model(); this.model.backup(); this.element.html(this.view('editor',this.model)); }, 'p.deleteoffice button click':function(el,ev){ switch(el.attr("name")){ case 'delete': el.closest('div').model().destroy(); break; case 'cancel': this.init(); break; } return false; }, /** * 部门信息修改点击动作处理函数 */ 'p.updateoffice button click':function(el,ev){ ev.preventDefault(); switch(el.attr("name")){ case 'submit': if(this.model.isDirty()){ var errors = this.model.errors(); if(null == errors){ this.model.save(); }else{ for(var error in errors){ $("#"+error).addClass("error"); $("#"+error).attr("title",errors[error][0]); $("#"+error).focus(); return; } } }else{ this.init(); } break; case 'reset': this.model.restore(); this.model.backup(); break; } return false; }, "{Personnel.Models.Office} destroyed" : function(Office, ev, office) { office.elements(this.element).remove(); this.init(); }, "{Personnel.Models.Office} created" : function(Office, ev, office){ this.init(); }, "{Personnel.Models.Office} updated" : function(Office, ev, office){ this.model.backup(); this.init(); } }); });
最后,我们来实现一下history的功能,即我们在浏览上点击前进/后退的功能,
在这里我们需要使用到插件:jquery/dom/route
因此,我们使用命令创建了模块router,
在Doc窗口执行:js query/generate/scaffold Personnel.Models.Router。
在router模块中,我们添加了一个友好的提示,就是在当我们在修改部门信息时,
信息如果已经被修改,如果我们没有保存,则当我们跳转页面时,会弹出一个
友好提示:当前数据已经修改,是否需要保存?,点击确认则保存,并且跳转。
修改router模块的create.js文件,结果如下:
steal( 'jquery/controller', 'jquery/view/ejs', 'jquery/dom/form_params', 'jquery/controller/view') .then('./views/init.ejs', function($){ /** * @class Personnel.Router.Create * @parent index * @inherits jQuery.Controller * Creates routers */ $.Controller('Personnel.Router.Create', /** @Prototype */ { '{$.route} change' : function(el, ev, attr, how, newVal, oldVal) { switch (attr) { case 'type': this.nav_change(newVal,oldVal); break; } }, nav_change : function(val,oldVal) { var controller = $("#content").controller(); if(controller){ if(controller.model){ if(controller.model.isDirty()){ var btn = confirm("当前数据已经修改,是否需要保存?"); if(btn){ controller.model.save(); } } } /** * 因为我们都在content的Div上显示视图, * 所以在绑定一个控制器之前一定要把之前 * 的控制器销毁。 */ controller.destroy(); } switch(val){ case 'departmentlist': $('#content').personnel_office_list(); break; case 'adddepartment': $('#content').personnel_office_create(); break; } } }) });
至此我们这个实战完成,现在我们总结一下,我们给大家讲了些什么关键点:
1、如何创建工程,模块。
2、如果校验
3、如何分页
4、如果实现记录点击记录,实现前进和后退。
5、页面如何更友好。
在工程各个文件中,各个文件,我都添加了一些关键的说明,大家要阅读代码,可以看到
这些点都是很有用的。
下面附带上工程源代码。
- personnel.rar (94.8 KB)
- 下载次数: 52
评论
谢谢.有啥资料可推荐看得?
校验需要完成那些代码,只要你把上面提供的修改点,更新这2个文件就可以校验了。
那添加功能实现了嘛?
saved : function(el){
$(this.element[0]).children("form")[0].reset();
return false;
}
这段并没有把数据添加到表中,这里怎么取到用户填写的值啊? 谢谢啦
校验需要完成那些代码,只要你把上面提供的修改点,更新这2个文件就可以校验了。
ROOT\
documentjs\
jquery\
funcunit\
steal\
personnel\
personnel.js
personnel.html
OK, 好了,我再仔细研究下Code. 谢谢了
ROOT\
documentjs\
jquery\
funcunit\
steal\
personnel\
personnel.js
personnel.html
我打开后,点击里面的链接都是失败的,为什么?
发表评论
-
test
2012-11-21 19:31 0关于请假: 1、做好工作安排,回复华为正式邮件! 2、回去 ... -
JavaScriptMVC之快速开发
2012-04-28 21:53 4450有些同学反映说,需要看太多的篇章才能明白如何使用JavaScr ... -
JavaScriptMVC之语言助手
2012-04-26 21:00 1499在这篇文章,我只挑 ... -
JavaScriptMVC之专用事件
2012-04-26 20:32 1581JavaScriptMVC提供了一串很 ... -
JavaScriptMVC之Model
2012-04-25 22:52 2058Model顶层负责程序的数据层,使用它可以很容易做以下操作: ... -
JavaScriptMVC之View
2012-04-24 20:35 2233视图提供在JQuery中使用模板的一致接口。 当模板 ... -
JavaScriptMVC之Controller
2012-04-24 20:08 1791Controller帮助创建合理的,可释放内存,快速执行jQu ... -
JavaScriptMVC之控制器监听事件
2012-04-23 21:16 1626控制器安装和卸载事件句柄非常容易。卸载事件句柄对于防止内存泄漏 ... -
JavaScriptMVC之Class
2012-04-23 20:50 1345Class提供相当继承的功能。使用Class就可以让我们结合面 ... -
JavaScriptMVC之Fixture续
2012-04-22 00:54 1252其实下面我写的主要并 ... -
JavaScriptMVC之数据处理
2012-04-21 23:42 1260常常,项目中创建,修 ... -
JavaScriptMVC之数据绑定(jquery.tie)
2012-04-20 23:14 1735如果开发过Java的RCP程序的同学就会知道数据绑定datab ... -
JavaScriptMVC之Fixture
2012-04-20 22:19 1469注:阅读这篇同学必须 ... -
从JavaScriptMVC开始如何完成项目之压缩文件和生成帮助文档
2012-04-13 23:45 15521、压缩文件 在厨师手 ... -
从JavaScriptMVC开始如何完成项目之创建测试程序
2012-04-13 21:56 1067JavaScriptMVC放一个极大强调的重点在测试方面。Ja ... -
从JavaScriptMVC开始如何完成项目之创建应用程序
2012-04-12 23:56 1232如何使用JavaScriptMVC开发项目第一步,就是创建应用 ... -
JavascriptMVC 之 route 的 history功能的使用
2012-04-08 11:10 1697JavascriptMVC 之 route 的 his ... -
wijmo+javascriptmvc开发注意事项
2012-04-07 09:31 1344下面是在使用wijmo+javasc ... -
javascriptmvc之funcunit
2012-03-30 00:19 1042javascriptmvc之funcunit funcu ... -
学习jquery mvc第一天,hello
2012-03-29 23:09 2265学习jquery mvc第一天,hello 做为程序员,对于 ...
相关推荐
上传了一半的javascriptmvc3.0.5,这个是【下】
JavaScriptMVC是一个全面的JavaScript应用程序开发框架,专注于构建大型、可维护的前端应用。这个压缩包"javascriptmvc-3.3.zip"包含了该框架的3.3版本。JavaScriptMVC以其模块化、可测试和高性能的特点,深受开发者...
JavaScriptMVC是一个强大的JavaScript MVC(Model-View-Controller)框架,专为构建复杂且高性能的前端Web应用而设计。这个框架旨在提供一套完整的工具集,包括数据管理、视图渲染、路由控制以及测试支持,从而使得...
JavaScriptMVC是一个强大的前端开发框架,它以JavaScript为核心,结合了Model-View-Controller(MVC)设计模式,旨在提供一套完整的解决方案,帮助开发者构建高效、可维护的Web应用程序。这个开源项目是基于jQuery和...
JavaScriptMVC是一个全面的JavaScript开发框架,专注于构建大型、可维护的前端应用。这个3.2.4版本的压缩包包含了一系列工具和库,旨在帮助开发者遵循Model-View-Controller(MVC)设计模式,提高代码组织和项目管理...
在“从JavaScriptMVC开始如何完成项目之压缩文件和生成帮助文档”这个主题中,我们将探讨如何利用该框架进行项目开发,特别是涉及到的压缩文件处理和生成帮助文档这两个关键环节。 一、压缩文件 在项目开发中,压缩...
JavaScript MVC(Model-View-Controller)是一种用于构建前端Web应用程序的架构模式,灵感来源于Java的MVC框架。这种模式在JavaScript开发中广泛采用,旨在提高代码的组织性、可维护性和可扩展性。...
javascriptmvc3.0.5,文件大于20MB,分成两个卷
这篇博客文章“从JavaScriptMVC开始如何完成项目之创建应用程序”可能是指导开发者如何使用特定的JavaScript MVC框架或库来构建一个完整的应用程序。 在JavaScript MVC中: 1. **模型(Model)**:负责处理和管理...
Mithril.js 是一个客户端的 JavaScript MVC 框架。可将应用分成数据层、UI层和控制层。Mithril 压缩后只有 3kb 左右。API 提供一个模板引擎,带 DOM diff 实现,支持路由和组合。 示例代码: ...
JavaScript MVC模式是Web开发中的一种架构模式,它用于组织和管理复杂的前端应用。MVC,即Model-View-Controller,是一种设计模式,旨在分离应用程序的数据层(Model)、用户界面层(View)和控制逻辑层(Controller...
JavaScript MVC开源框架是一种用于构建富前端应用的框架,它整合了多种JavaScript库和技术,如jQuery,使得开发者可以更高效地组织和管理前端代码,实现Model-View-Controller(MVC)设计模式。...
JavaScript MVC(Model-View-Controller)是一种用于构建前端应用程序的架构模式,它借鉴了传统的后端MVC设计模式,以帮助开发者组织和管理复杂的JavaScript应用。在这个架构中,Model负责数据处理,View负责用户...
JavaScriptMVC是一个全面的前端开发框架,专注于使用JavaScript进行复杂应用程序的构建。它结合了Model-View-Controller(MVC)的设计模式,提供了一整套工具和服务,旨在提高开发效率和代码可维护性。在这个高级...
在"javascriptMVC 相关资料.docx"文档中,可能会包含以下知识点: 1. **MVC概念**:解释模型(Model)、视图(View)和控制器(Controller)的基本职责。模型处理数据和业务逻辑,视图负责用户界面的展示,而控制器...
:选择JavaScriptMVC框架很难。一方面要考虑的因素非常多,另一方面这种框架也非常多,而要从中选择一个合适的,还真得费一番心思。本文对JavaScriptMVC框架Angular、Backbone、CanJS和Ember作了比较,供大家参考。...
内容索引:脚本资源,Ajax/JavaScript,JavaScriptMVC JavaScriptMVC 是一个功能强大的 JavaScript framework. 也是一个很棒的JavaScript测试框架,它同样能提高开发的速度。JavaScriptMVC应用了模型-视图-控制器架构...