貌似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 +
' ' + '联系人:' +
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方面设计合理些,业务逻辑不太复杂的话,可以做出来比较复杂的页面(大量的对话框,关联菜单,过滤表格,事件处理等)。
希望这些实践能为感兴趣的筒子们有所帮助。
分享到:
相关推荐
总结来说,jQuery Mobile 和 ASP.NET 的组合为开发者提供了一条快速、高效地构建移动Web应用的途径。通过利用两者的优势,可以创建出既美观又实用的跨平台应用,满足不同用户的需求。在实际开发过程中,不断学习和...
**jQuery Mobile 手机端 MVC 模式与 C# 结合详解** 在移动应用开发领域,jQuery Mobile 和 C# MVC 模式结合提供了一种高效、便捷的开发方式,尤其适用于初学者。jQuery Mobile 是一个强大的框架,专为触摸设备优化...
**jQuery Mobile 1.4.2 for Asp.net** jQuery Mobile 是一个专为移动设备设计的前端框架,它简化了在智能手机和平板电脑上构建交互式网页应用的过程。本项目基于jQuery Mobile 1.4.2版本,与Asp.net进行整合,提供...
总结,结合MVC4和JQuery Mobile创建对话框,可以实现高度复用和优秀的用户体验,使得Web应用在移动设备上也能展现出类似桌面应用的交互性和功能。通过合理设计Controller、视图和交互逻辑,我们可以轻松地构建出专业...
jQuery Mobile快速入门245页完整版.pdf + 所有源码.7z 24H内删除,作者写书非常不容易,如觉得好,请购买纸质书籍,易读易懂!藏书不如读书,读书请买好书,这是好书。 第1章 jquery mobile简介 1.1 通用访问 ...
本篇文章将深入探讨 `jquerymobile一系列开源案例` 中涉及的关键知识点,并对每个压缩包内的文件进行解析。 1. **jm 各种界面.rar** 这个压缩包很可能包含了使用 jQuery Mobile 实现的各种不同类型的界面示例,如...
1. **Backbone 移动实例**:Backbone.js 是一个轻量级的MVC框架,与jQuery Mobile结合可以创建功能丰富的移动应用。学习Backbone的移动示例有助于理解如何组织和管理应用程序的结构。 2. **媒体查询**:媒体查询是...
对于任何学习jQuery Mobile或使用MVC3构建移动应用程序的人来说,这篇文章都非常... 我为手机构建了一个遥控器,以控制游泳池的喷枪,打开车库门,在花园中浇水并使用带有MVC和Netduino的jQuery Mobile来控制燃气壁炉
jQuery ASP.Net MVC Controls源码 项目介绍 一个ASP.Net MVC兼容包基础上完成控制jQuery和jqGrid框架。 * Ajax的分页,编辑,分格,批量更新 * 标准widgets,如DatePicker * 还有更多- 所有.NET Fluent-like配置和...
在ASP.NET MVC 4框架中,...要开始使用jQuery Mobile,你需要在ASP.NET MVC 4项目的视图布局文件(_Layout.cshtml)中引入jQuery和jQuery Mobile的JavaScript和CSS文件。这通常包括添加以下链接到部分: ```html ...
与jQuery Mobile相比,Sencha Touch在性能上表现出色,尤其在处理复杂DOM结构时,它的优化更为显著,能够提供更加流畅的用户体验。 Sencha Touch的优势在于其强大的数据绑定和模型层,这使得数据管理变得简单而高效...
作为jquery mobile的入门级读物,《jquery mobile快速入门》以示例方式讲解了jquery mobile的基本知识和核心特性,内容系统全面,便于理解。 《jquery mobile快速入门》总共分为10章,内容包括jquery mobile的基础...
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.
我只是想将网站从移动版定向到普通版。 当我从普通版转到移动版时,它可以正常工作,但如果我从移动版转到普通版,则可以应用移动样式。 以下是我的_layout.cshtml和_mobileLayout.cshtml代码。...
##Purpose 轻量级 jQuery Mobile MVC-ish 延迟加载库。 使项目创建快速简便。 延迟加载控制器和视图。 模型留给开发人员。 辅助方法提供快速简便的 UI 功能。 ####Notes 这并不是一个包罗万象的框架(它只有 300...
2. **jQuery和jQuery Mobile**:内置对最新jQuery库的支持,简化了客户端脚本的编写。同时,对于移动开发,还集成了jQuery Mobile,帮助快速创建触摸友好的UI。 3. **Web API**:ASP.NET Web API是构建RESTful服务...