`

jquery mobile的mvc实践并总结

阅读更多

貌似jquery.mobile和backbones的一些实践网上有很多了,我就分享下最近做的jquery.mobile的应用,中间mvc和数据、逻辑隔离部分的设计和代码。

 

首先就是“单入口模式”——这种设计无处不在啊。

 

在jquery.mobile的设计里,有很多page切换的钩子方法,具体可以参考官方文档demos/docs/api/events.html里的列表。

 

因为我做的应用大多是和和传统的request那种模式差不多的,就是在page渲染之前,先对page的dom做一次数据组装,所以用到较多的是pagebeforecreate这个方法,上文说的“单入口”就是这个方法做入口,然后派发,比作DispatchController。

 

 

贴下代码:

 

// mobile page 工具类,获取dom元素的值,跳转事件的过滤等
// need pageData对象,本类的实例对象
// x.js page.data.js
var PageUtils = {
	initBindLl: ['pagebeforechange', 'pagebeforecreate', 'db'], 

	initApp: function(){
		var _pageBase = $("div[data-role='page'],div[data-role='dialog']");
		if(PageUtils.initBindLl.contains('pagebeforechange')){
			_pageBase.live("pagebeforechange", function(e, data){
				// while loading a page by URL
				if(typeof data.toPage === "string"){
					var currentPage = IPage.parsePage(document.location.href);
					var toPage = IPage.parsePage(data.toPage);

					var pageName = IPage.parsePageName(data.toPage);
					var pageObj = PageUtils.pages[pageName];
					if(pageObj){
						pageObj.setPageInfo(toPage, currentPage);
						var flag = pageObj.canAccess();
						if(flag === false){
							e.preventDefault();
						}
					}
				}else if(typeof data.toPage === "object"){
					// load page dom
				}
			});
		}

		if(PageUtils.initBindLl.contains('pagebeforecreate')){
			_pageBase.live('pagebeforecreate', function(e){
				var currentPage = IPage.parsePage(document.location.href);
				var toPage = IPage.parsePage(this.baseURI);

				var pageName = IPage.parsePageName(this.baseURI);
				var pageObj = PageUtils.pages[pageName];
				if(pageObj){
					pageObj.setPageInfo(toPage, currentPage, this);
					pageObj.initDomEntry();
				}
			});
		}

		if(PageUtils.initBindLl.contains('db')){
			// page db initialize
			PageDb.initTables();
		}
	}, 

	// application pages
	pages: {
		pageTaskLl: new PageTaskLl(), 

		pageOne: new PageOne,
                // add your pages here

		
		dump: ''
	}, 

	dump: ''
};

 

 

其中抽象了一组application pages,具体实现如下,先定义个接口

 

/**
* Begin class defination Ipage : mobile page 抽象类,一个页面的接口方法
*/
var IPage = Base.extend({
	// mobile.path.parseUrl : page info
	info: null, 
	from: null, 

	// 对dom page的引用
	_page: null, 

	constructor: function(){},

	setPageInfo: function(i, f, pageDom){
		this.info = i;
		this.from = f;
		if(pageDom)
			this._page = $(pageDom);
	}, 

	// 页面dom初始化
	initDomEntry: function(){
		this.initDomBefore();
		this.initDom();
	}, 
	initDomBefore: function(){
		// append parameter
		var search = this.info.search;
		this.dom('#surveyNav a, a.urlPend').each(function(){
			var srcUrl = $(this).attr('href');
			$(this).attr('href', srcUrl + search);
		});
	}, 
	// need to overwrite 模板方法
	initDom: function(){}, 

	params: function(){
		return IPage.parseSearch(this.info.search);
	}, 

	canAccess: function(){return true;}, 

	dom: function(selecter){
		return this._page.find(selecter);
	}, 

	dump : '' 
	},{

	// 辅助方法
	// 获取url参数键值对,不包含'?'
	parseSearch: function(query){
		var data = {};
		if(query){
			_.each(query.substring(1).split('&'), function(one){
				var arr = one.split('=');
				if(arr.length == 2)
					data[arr[0]] = arr[1];
			});
		}
		return data;
	}, 

	// 获取url参数键值对,包含'?'
	parseSearchByUrl: function(url){
		return this.parseSearch(url.substring(url.indexOf('?')));
	}, 

	parsePageName: function(url){
		var filename = IPage.parsePage(url).filename;
		return filename.substring(0, filename.lastIndexOf('.'));
	}, 

	parsePage: function(url){
		return $.mobile.path.parseUrl(url);
	}, 

	// 一些通用的业务逻辑相关的方法
	commonFn: {
	}, 

	// 一些通用的dom生成的方法
	commonDomFn: {
	}, 

	dump : '' 
});

 

这样,一个mobile页面就对应一个IPage子类的实例对象,举例:

 

/**
* Begin class defination PageTaskLl 
* 任务列表
*/
var PageTaskLl = IPage.extend({
	// 页面dom初始化
	initDom: function(){
		var _this = this;
		var _navLl = _this.dom('#navSub button');
		_navLl.click(function(e){
			// 分页显示,默认显示第一页,一页10条记录
			_this.taskLlRefresh($(this).attr('val'), 1, 10);

			PageTheme.toggleBtnClass($(this), 'c', 'b');
			PageTheme.toggleBtnClass(_navLl.not(this), 'b', 'c');
		});

		// 根据参数显示已完成还是未完成,默认是所有
		var params = this.params();
		var type = params.type || 'all';
		_navLl.filter('[val={0}]'.format(type)).trigger('click');
	}, 

	taskLlRefresh: function(type, cp, npp){
		var _ul = this.dom('ul[data-role="listview"]');
		_ul.empty();

		var _this = this;
		// 异步的
		this.getCaseLl(type, cp, npp, function(item){
			_ul.append(_this.domFn.getTaskLi(item));
		}, function(pager){
			_ul.listview('refresh');

			// 分页导航
			var _piDiv = _this.dom("#taskLl");
			_piDiv.html(pager.getHtml2());
			_piDiv.find("a.piLink").click(function(){
				var cpTarget = parseInt($(this).text());
				_this.taskLlRefresh(type, cpTarget, npp);
			});
		});
	}, 

	// **** **** **** **** **** **** **** ****
	// **** **** **** **** **** **** **** ****
	// 数据库相关操作
	// 获取案件列表
	getCaseLl: function(type, cp, npp, fn, callback){
		var sql = 'select * from t_claim_case where 1 = 1';
		var args = [];
		if(type && 'all' != type){
			sql += ' and type = ?';
			args.push(type);
		}
		XDB.piAndMap(sql, args, cp, npp, fn, callback);
	}, 

	// **** **** **** **** **** **** **** ****
	// **** **** **** **** **** **** **** ****
	// dom相关操作
	domFn: {
		// 任务列表
		// 建议使用easyTemplate做html代码生成,比较简洁明了
		getTaskLi: function(item){
			var fnDd = XHtml.createFn('dd');
			var tpl2 = fnDd(
					XHtml.tag('报案号:' + item.caseNo + '(' + item.type + ')', 'h3') 
					+ '<br />'
					+ XHtml.tag('车牌号:' + 
						item.vehicleNo + 
						'&nbsp;&nbsp;' + '联系人:' + 
						item.concatName, 'p')) + 
				fnDd('联系人手机:' + item.concatPhone) + 
				fnDd('报案时间:' + item.claimDate.format());
			var tpl = XHtml.alink(tpl2, 'pageCaseBase.gy?caseNo={0}'.format(item.caseNo));

			var imgInner = '<img src="{0}mb/claim/img/case.png" />'.format(X.appPath);
			return XHtml.tag(imgInner + tpl, 'li');
		}
	}, 


	dump : '' 
	},{
	dump : '' 
});

 

页面效果截图如下:

 

 

 

 

 

PS,通过这个设计(一个页面对应一个js文件),如果js的oo方面设计合理些,业务逻辑不太复杂的话,可以做出来比较复杂的页面(大量的对话框,关联菜单,过滤表格,事件处理等)。

 

 

希望这些实践能为感兴趣的筒子们有所帮助。

分享到:
评论
3 楼 key232323 2012-11-22  
tomcat886 写道
求源代码, 谢谢

能贴出源代码么?



不好意思啊。。。贴不了——不过这个MVC是基于jquery mobile的pagebeforechange事件回调做的,粒度很粗,借鉴意义不大的
2 楼 tomcat886 2012-11-22  
求源代码, 谢谢

能贴出源代码么?
1 楼 struas 2012-11-20  
能贴出源代码么?

相关推荐

    Jquery Mobile +Asp.net

    总结来说,jQuery Mobile 和 ASP.NET 的组合为开发者提供了一条快速、高效地构建移动Web应用的途径。通过利用两者的优势,可以创建出既美观又实用的跨平台应用,满足不同用户的需求。在实际开发过程中,不断学习和...

    jquery mobile手机端MVC模式C#

    **jQuery Mobile 手机端 MVC 模式与 C# 结合详解** 在移动应用开发领域,jQuery Mobile 和 C# MVC 模式结合提供了一种高效、便捷的开发方式,尤其适用于初学者。jQuery Mobile 是一个强大的框架,专为触摸设备优化...

    Jquery Mobile 1.4.2 for Asp.net

    **jQuery Mobile 1.4.2 for Asp.net** jQuery Mobile 是一个专为移动设备设计的前端框架,它简化了在智能手机和平板电脑上构建交互式网页应用的过程。本项目基于jQuery Mobile 1.4.2版本,与Asp.net进行整合,提供...

    MVC4 JQuery Mobile建立对话框的专业实践.

    总结,结合MVC4和JQuery Mobile创建对话框,可以实现高度复用和优秀的用户体验,使得Web应用在移动设备上也能展现出类似桌面应用的交互性和功能。通过合理设计Controller、视图和交互逻辑,我们可以轻松地构建出专业...

    jQuery Mobile快速入门245页完整版.pdf + 所有源码.7z

    jQuery Mobile快速入门245页完整版.pdf + 所有源码.7z 24H内删除,作者写书非常不容易,如觉得好,请购买纸质书籍,易读易懂!藏书不如读书,读书请买好书,这是好书。 第1章 jquery mobile简介  1.1 通用访问 ...

    jquerymobile一系列开源案例

    本篇文章将深入探讨 `jquerymobile一系列开源案例` 中涉及的关键知识点,并对每个压缩包内的文件进行解析。 1. **jm 各种界面.rar** 这个压缩包很可能包含了使用 jQuery Mobile 实现的各种不同类型的界面示例,如...

    经典收藏 50个jQuery Mobile开发技巧集萃

    1. **Backbone 移动实例**:Backbone.js 是一个轻量级的MVC框架,与jQuery Mobile结合可以创建功能丰富的移动应用。学习Backbone的移动示例有助于理解如何组织和管理应用程序的结构。 2. **媒体查询**:媒体查询是...

    结合使用jQuery Mobile和MVC和Netduino进行家庭自动化

    对于任何学习jQuery Mobile或使用MVC3构建移动应用程序的人来说,这篇文章都非常... 我为手机构建了一个遥控器,以控制游泳池的喷枪,打开车库门,在花园中浇水并使用带有MVC和Netduino的jQuery Mobile来控制燃气壁炉

    jQuery ASP.Net MVC Controls源码

    jQuery ASP.Net MVC Controls源码 项目介绍 一个ASP.Net MVC兼容包基础上完成控制jQuery和jqGrid框架。 * Ajax的分页,编辑,分格,批量更新 * 标准widgets,如DatePicker * 还有更多- 所有.NET Fluent-like配置和...

    在ASP.NET MVC 4中使用jQuery Mobile开发特定于移动的视图-第1部分

    在ASP.NET MVC 4框架中,...要开始使用jQuery Mobile,你需要在ASP.NET MVC 4项目的视图布局文件(_Layout.cshtml)中引入jQuery和jQuery Mobile的JavaScript和CSS文件。这通常包括添加以下链接到部分: ```html ...

    webapp界面UI框架Sencha Touch 是WEB APP的界面UI组件库,明显比jquery Mobile快.zip

    与jQuery Mobile相比,Sencha Touch在性能上表现出色,尤其在处理复杂DOM结构时,它的优化更为显著,能够提供更加流畅的用户体验。 Sencha Touch的优势在于其强大的数据绑定和模型层,这使得数据管理变得简单而高效...

    《jQuery Mobile快速入门》.((美)Brad Broulik ).[PDF]

    作为jquery mobile的入门级读物,《jquery mobile快速入门》以示例方式讲解了jquery mobile的基本知识和核心特性,内容系统全面,便于理解。 《jquery mobile快速入门》总共分为10章,内容包括jquery mobile的基础...

    mvc3,4,5区别于联系

    mvc3.mvc4/mvc5区别于联系,...5.Jqeury : it provides better support for jquery like Jquery Mobile. 6.MVC3 support powerful hooks with Dependency Injection and Global Action Filters. and Mvc4 also supports.

    asp.net mvc中的jquerymobile-通过actionlink从移动视图切换到主站点会更改样式

    我只是想将网站从移动版定向到普通版。 当我从普通版转到移动版时,它可以正常工作,但如果我从移动版转到普通版,则可以应用移动样式。 以下是我的_layout.cshtml和_mobileLayout.cshtml代码。...

    jQM-MVC-Lazy-Loader:用于延迟加载模块的 jQuery Mobile 的超轻量级 MVC。 “app”对象上有一些辅助方法来帮助 UI 开发

    ##Purpose 轻量级 jQuery Mobile MVC-ish 延迟加载库。 使项目创建快速简便。 延迟加载控制器和视图。 模型留给开发人员。 辅助方法提供快速简便的 UI 功能。 ####Notes 这并不是一个包罗万象的框架(它只有 300...

    ASP.NET MVC4 Web编程

    2. **jQuery和jQuery Mobile**:内置对最新jQuery库的支持,简化了客户端脚本的编写。同时,对于移动开发,还集成了jQuery Mobile,帮助快速创建触摸友好的UI。 3. **Web API**:ASP.NET Web API是构建RESTful服务...

Global site tag (gtag.js) - Google Analytics